Java サーブレットから (現在のユーザーではなく) ローカル マシン ストアに保存されている証明書にアクセスすることは可能ですか? 「Windows-MY」および「Windows-ROOT」ストアを開く MSCAPI プロバイダーを使用してみましたが、ローカル コンピューター ストアからの証明書はどちらにも含まれていません。
4 に答える
デフォルトの JDK 実装はかなり制限されています。私の知る限り、RSAキーと証明書のみが返されます。MSCAPI への汎用アダプタではありません。あなたが説明したメカニズムを使用して、いくつかの証明書を取り戻すことができました。
他の人が述べたように、MSCAPI プロバイダーは、「ローカル コンピューター」証明書ストアに格納されている証明書とキーへのアクセスを提供しません。これは、MSCAPI が Microsoft CryptoAPI 関数CertOpenSystemStore
を使用して証明書とキーにアクセスするためです。この関数のドキュメントには、「ローカル マシン ストアではなく、このメソッドを使用してアクセスできるのは現在のユーザー証明書のみです」と明示的に記載されています。この問題の進行状況を追跡したい場合は、この OpenJDK バグをフォローしてください。
問題の適切な解決策が必要な場合は、商用のPheox JCAPIライブラリを購入できます。
ハッキングを受け入れることができる場合は、「現在のユーザー」と「ローカル マシンの両方の証明書とキーへの読み取り専用アクセスを許可する仮想証明書ストアへの JDK 呼び出しをインターセプトし、ハンドルを返す単純なユーティリティCertOpenSystemStore
を作成しました。 "証明書ストア。これで問題は解決しましたが、このユーティリティの制限に注意してください。
探している証明書は、Java キーストア ファイルにあるか、サーバーの起動時に tomcat に渡されます。
http://tomcat.apache.org/tomcat-4.0-doc/ssl-howto.html
それらをアプリケーションにロードしようとしている場合は、こちらを参照して HTTPS リクエストを作成してください。HTTPClient のドキュメントを参照してください。
参考になるかわかりませんが、詳しく教えていただけるとより具体的な回答が得られるかもしれません
public class KeyStoreLookup {
public static void main(String args[]) {
try {
KeyStore ks =
KeyStore.getInstance(KeyStore.getDefaultType());
String fname = System.getProperty("user.home") +
File.separator + ".keystore";
FileInputStream fis = new FileInputStream(fname);
ks.load(fis, null);
if (ks.isKeyEntry(args[0])) {
System.out.println(args[0] +
" is a key entry in the keystore");
char c[] = new char[args[1].length()];
args[1].getChars(0, c.length, c, 0);
System.out.println("The private key for" + args[0] +
" is " + ks.getKey(args[0], c));
Certificate certs[] = ks.getCertificateChain(args[0]);
if (certs[0] instanceof X509Certificate) {
X509Certificate x509 = (X509Certificate) certs[0];
System.out.println(args[0] + " is really " +
x509.getSubjectDN());
}
if (certs[certs.length - 1] instanceof
X509Certificate) {
X509Certificate x509 = (X509Certificate)
certs[certs.length - 1];
System.out.println(args[0] + " was verified by " +
x509.getIssuerDN());
}
}
else if (ks.isCertificateEntry(args[0])) {
System.out.println(args[0] +
" is a certificate entry in the keystore");
Certificate c = ks.getCertificate(args[0]);
if (c instanceof X509Certificate) {
X509Certificate x509 = (X509Certificate) c;
System.out.println(args[0] + " is really " +
x509.getSubjectDN());
System.out.println(args[0] + " was verified by " +
x509.getIssuerDN());
}
}
else {
System.out.println(args[0] +
" is unknown to this keystore");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}