14

CAによって署名された証明書を含むJKSキーストアがあります。nginx で使用するには、PEM 形式でエクスポートする必要があります。クライアントが署名を検証できるように、チェーン全体が含まれるようにする必要があります。

私が次のようなことをした場合:

keytool -exportcert -keystore mykestore.jks -file mycert.crt -alias myalias
openssl x509 -out mycert.crt.pem -outform pem -in mycert.crt -inform der

最低レベルの証明書のみが含まれます。検証は失敗します:

$ openssl s_client -connect localhost:443
CONNECTED(00000003)
depth=0 /O=*.mydomain.com/OU=Domain Control Validated/CN=*.mydomain.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /O=*.mydomain.com/OU=Domain Control Validated/CN=*.mydomain.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 /O=*.mydomain.com/OU=Domain Control Validated/CN=*.mydomain.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:/O=*.mydomain.com/OU=Domain Control Validated/CN=*.mydomain.com
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure Certification Authority/serialNumber=123123
... (only one certificate!)
...
SSL-Session:
    ...
    Verify return code: 21 (unable to verify the first certificate)

Java から:

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

一方、同じ JKS キーストアを持つ Jetty は次を出力します。

$ openssl s_client -connect localhost:8084
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
 0 s:/O=*.mydomain.com/OU=Domain Control Validated/CN=*.mydomain.com
   i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure Certification Authority/serialNumber=1234
 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./OU=http://certificates.godaddy.com/repository/CN=Go Daddy Secure Certification Authority/serialNumber=1234
   i:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
 2 s:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
   i:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
SSL-Session:
    Verify return code: 19 (self signed certificate in certificate chain)

openssl はその 19 エラーを返しますが、これはもはや Java の問題ではなく、HttpsURLConnection私が気にかけているのはそれだけです。

では、 nginx サーバーと Java クライアントの両方で動作する形式 (PEM など) で JKS からチェーン全体をエクスポートするにはどうすればよいでしょうか? 私は何が欠けていますか?

4

3 に答える 3

16

JKS ファイルを PKCS12 ファイルに簡単に変換できます。

keytool -importkeystore -srckeystore keystore.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore keystore.p12

次に、秘密鍵と証明書を次のように抽出できます。

openssl pkcs12 -in keystore.p12
于 2013-02-04T16:35:38.347 に答える
11

私が頻繁に遭遇するかなり大きな問題は、証明書を取得するためにCSRを生成するときに、キーストア(Sun形式のjksキーストア)が.keyを出力しないか、.keyを取得するための機能を提供しないことです。そのため、私は常に.pem / .crtを使用し、Apache2で使用する方法がありませんでした。Apache2はTomcatのようにJKSキーストアを読み取ることができませんが、代わりにパッケージ化されていない.key + .pem/.crtのペアが必要です。

開始するには、既存のキーストアの「コピー」を取得して、以下の5番目のコマンドにスキップするか、次のように独自のキーストアを作成します。

C:\Temp>keytool -genkey -alias tomcat -keyalg RSA -keystore
 keystore.jks -keysize 2048 -validity 730 -storepass changeit

次に、オプションで、次の3つのステップのプロセスで、2年間のCSRを作成し、CSR応答をインポートします。

C:\Temp>keytool -certreq -alias mydomain -keystore keystore.jks
 -file mydomain.csr
C:\Temp>keytool -import -trustcacerts -alias root -file
 RootPack.crt -keystore keystore.jks -storepass changeit
C:\Temp>keytool -import -trustcacerts -alias tomcat -file mydomain.response.crt
 -keystore keystore.jks -storepass changeit

これを機能させるには、Tomcatアプリケーションサーバーに使用するJKSキーストアファイルがすでにある場合は、次の手順に従います。

まず、DER(バイナリ)形式の証明書を「exported-der.crt」というファイルに取得します。

C:\Temp>keytool -export -alias tomcat -keystore keystore.jks -file
 exported-der.crt

次に、それを表示して確認します。

C:\Temp>openssl x509 -noout -text -in exported-der.crt -inform der

次に、これをPEM形式に変換する必要があります。これは、ApacheなどのアプリケーションやOpenSSLでPKCS12変換を行うために広く使用されています。

C:\Temp>openssl x509 -in exported-der.crt -out exported-pem.crt 
-outform pem -inform der

次に、ExportPrivをダウンロードして使用し、暗号化されていない秘密鍵をキーストアから取得します。

C:\Temp>java ExportPriv <keystore> <alias> <password> > exported-pkcs8.key

お気づきかもしれませんが、秘密鍵はPKCS#8PEM形式でエクスポートされています。Apache(PKCS#12 ??)で動作するRSA形式にするには、次のコマンドを発行できます。

C:\Temp>openssl pkcs8 -inform PEM -nocrypt -in exported-pkcs8.key
 -out exported-pem.key
于 2011-10-21T20:15:01.130 に答える
0

でチェーンを抽出できるかどうかはわかりませんがkeytool、小さなJavaプログラムで抽出できます。

public void extract(KeyStore ks, String alias, char[] password, File dstdir) throws Exception
{
    KeyStore.PasswordProtection pwd = new KeyStore.PasswordProtection(password);
    KeyStore.PrivateKeyEntry entry = (KeyStore.PasswordKeyEntry)ks.getEntry(alias, pwd);
    Certificate[] chain = entry.getCertificateChain();
    for (int i = 0; i < chain.length; i++) {
        Certificate c = chain[i];
        FileOutputStream out = new FileOutputStream(new File(dstdir, String.format("%s.%d.crt", alias, i)));
        out.write(c.getEncoded());
        out.close();
    }
}

このコードは、送信されたディレクトリにチェーンのすべての証明書をDER形式で書き込む必要があります。

于 2011-09-28T12:00:59.040 に答える