Javaで非対称暗号化が必要です。 http://www.imacat.idv.tw/tech/sslcerts.html で述べたopensslによって、独自のパスワードと.crtファイルを使用して.keyファイルと.crtファイルを生成します。
これらの.keyおよび.crtファイルを使用してJavaで公開鍵と秘密鍵を抽出するにはどうすればよいですか?
.key
および.crt
ファイルはPEM形式である可能性があります。これを確認するには、テキストエディタでそれらを開き、コンテンツが------BEGIN CERTIFICATE------
(または「RSA秘密鍵の開始」...)のように見えるかどうかを確認します。 DERを明示的に指定していない限り、これは通常、OpenSSLで使用されるデフォルトの形式です。
おそらく必須ではありませんが(以下を参照)、証明書がDER形式(バイナリ形式)の場合は、次を使用してPEM形式に変換できます。
openssl x509 -inform DER -in cert.crt -outform PEM -out cert.pem
(必要に応じて、秘密鍵で同様のことを行うには、openssl rsa
のヘルプを確認してください。)
次に、2つのオプションがあります。
PKCS#12ファイルを作成する
openssl pkcs12 -export -in myhost.crt -inkey myhost.key -out myhost.p12
次に、Javaからタイプ "PKCS12"のキーストアとして直接使用できます。ほとんどのJavaアプリケーションでは、キーストアタイプに加えてキーストアタイプを指定できます。ファイルの場所。デフォルトのシステムプロパティの場合、これはjavax.net.ssl.keyStoreType
で実行されます(ただし、使用しているアプリケーションがこれを使用していない可能性があります)。それ以外の場合、明示的にロードする場合は、次のようなものを使用します。
KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis =
new FileInputStream("/path/to/myhost.p12");
ks.load(fis, "password".toCharArray()); // There are other ways to read the password.
fis.close();
(次に、 KeyStore
のaliases()
を反復処理し、getCertificate
を使用できるはずです(次にgetPublicKey()
for公開鍵)およびgetKey()
。
BouncyCastle の PEMReader
を使用します。
FileReader fr = ... // Create a FileReader for myhost.crt
PEMReader pemReader = new PEMReader(fr);
X509Certificate cert = (X509Certificate)pemReader.readObject();
PublicKey pk = cert.getPublicKey();
// Close reader...
秘密鍵の場合、秘密鍵がパスワードで保護されている場合は、PasswordFinder
を構築するためにPEMReader
(PEMReaderドキュメントのリンクを参照)を実装する必要があります。 (readObject()
の結果をKey
またはPrivateKey
にキャストする必要があります。)
これにより、(上記で提案したようにBouncyCastle PEMReaderを使用して)実行したいことが実行されます。PEMでエンコードされた秘密鍵と証明書を取得し、PKCS#12ファイルを出力します。秘密鍵の保護に使用されたのと同じパスワードをPKCS12に使用します。
public static byte[] pemToPKCS12(final String keyFile, final String cerFile, final String password) throws Exception {
// Get the private key
FileReader reader = new FileReader(keyFile);
PEMReader pem = new PEMReader(reader, new PasswordFinder() {
@Override public char[] getPassword() {
return password.toCharArray();
}
});
PrivateKey key = ((KeyPair)pem.readObject()).getPrivate();
pem.close();
reader.close();
// Get the certificate
reader = new FileReader(cerFile);
pem = new PEMReader(reader);
X509Certificate cert = (X509Certificate)pem.readObject();
pem.close();
reader.close();
// Put them into a PKCS12 keystore and write it to a byte[]
ByteArrayOutputStream bos = new ByteArrayOutputStream();
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(null);
ks.setKeyEntry("alias", (Key)key, password.toCharArray(), new Java.security.cert.Certificate[]{cert});
ks.store(bos, password.toCharArray());
bos.close();
return bos.toByteArray();
}
Org.bouncycastle.crypto.generators.OpenSSLPBEParametersGeneratorをご覧ください
私が理解しているように、OpenSSLはいわゆるPEM形式でファイルを保存しています。それをJavaキーストレージ(JKS)形式に変換してから、その形式(Javaにネイティブ)で作業してファイルを抽出する必要があります。変換には このGoogleクエリ 、かなり良い結果が得られます。
JKSファイルをJava.security.KeyStoreクラスにロードします。次に、getCertificateメソッドとgetKeyメソッドを使用して、必要な情報を取得します。