久しぶりのPKIプログラミングネタです。Windowsでは電子署名をするのにCAPIや.NET等の幾つかのAPIが用意されています。そのうち.NETのRSACryptoServiceProviderにおいて SignData() と VerifyData() のメソッド、つまりRSA署名とRSA検証のAPIの実行速度が遅くなると言う問題が見つかりました。
Problem: Delay while calling RSACryptoServiceProvider SignData or VerifyData methods
最初はアクティブディレクトリ認証(以後AD認証)が必要なサーバでのみ速度が遅く、LDAP通信が頻発していると言う事でした。どこでLDAP通信されているのか分からずテストプログラムを作成して試して頂きました。Windows証明書ストアへのアクセスにAD認証が必要なのではと予想したのですがハズレでした。結局RSA検証している箇所が遅くRSA検証を.NETからOpenSSLに変更したところLDAP通信が無くなったのでした。
そこからS社のMさんが見つけたのが上記リンクのページです(Mさんありがとうございました)。確かにこれに該当していたようです。RSAクラスにはハッシュアルゴリズムが指定可能であり、昨今ではSHA-2も指定する必要があります。デフォルトのSHA-1以外のハッシュアルゴリズムを利用した時にドメインコントローラに問合せに行ってしまうとのこと。回避方法はデフォルト(SHA-1)でやれ…って現在ではもう無理です(^^; と言うことでこういう事もあろうかと用意していたOpenSSLを使って全く同じ処理をするモジュールに切り替えて問題解決したのでした。
RSA検証はこれで良いのですがRSA署名にWindows証明書ストアの秘密鍵を使う場合にはOpenSSLでは対応できないのでWindowsのAPIを使わざるを得ません。1つ可能性があるのは古いCAPIのAPIを使えばこの問題が生じないのでは無いかと言う事なのですが…まだチェックしていません。追加で何か分かったら書き足します。
何はともあれ
.NET で
RSA署名 を
ドメインコントローラ利用環境 で使った場合には通信のオーバーヘッドによる速度低下があると言う情報を残します。と言ってもこの情報を必要としている人はほとんどいないかも(^^;;;