SSL接続が機能しない。私はウェブ上で多くの調査をしましたが、それでもそれがどうやらそれについての理解がまだ足りません。あなたが助けてくれるといいのですが。開発証明書チェーンを生成します:RootCA-> SubCA-> Server
私はこのようにそれらを生成します
openssl req -batch -x509 -config ${ROOTCA_CONFIG} -newkey rsa:2048 -sha1 -nodes -out ${ROOTCA_CERT} -outform PEM -days 7300
openssl req -batch -config ${SUBCA_CONFIG} -newkey rsa:2048 -sha1 -nodes -out ${SUBCA_CSR} -outform PEM
openssl ca -batch -config ${ROOTCA_CONFIG} -policy signing_policy -extensions signing_req_CA -out ${SUBCA_CERT} -infiles ${SUBCA_CSR}
次にRootCA証明書をJavaトラストストアに追加し、クライアント証明書をキーストアに追加します。これは私が最初に戸惑うことです。SubCA証明書には私が期待するプレーンテキスト情報があります。ルートCAには暗号化情報のみ(BEGIN CERTIFICATEとEND CERTIFICATEの間の部分があります。これは予期されたものですか?私のSubCA証明書は次のようになります。暗号化部分を切り捨てました:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=DE, O=Company, CN=Root CA 2016
Validity
Not Before: Oct 20 11:59:57 2016 GMT
Not After : Oct 18 11:59:57 2024 GMT
Subject: C=DE, O=Company, CN=SubCA 2016
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ae:0b:94:36:76:7c:34:d8:37:61:44:5f:1c:68:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
43:2E:0E:EB:66:C6:2F:AC:1B:24:C7:95:48:92:95:6E:E3:E0:83:1E
X509v3 Authority Key Identifier:
keyid:19:6B:27:27:F8:9F:56:E3:07:E7:AB:51:1E:15:DC:F8:F1:96:D5:35
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage:
Digital Signature, Certificate Sign, CRL Sign
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl.url
Authority Information Access:
CA Issuers - URI:http://downloads.some.url
次に、サーバー証明書を作成します(変数名は両方を生成するために使用されるため、変数名はクライアントと呼ばれます)。
openssl req -batch -config ${CLIENT_CONFIG} -newkey rsa:2048 -sha256 -nodes -out ${CLIENT_CSR} -outform PEM -keyout $1.key
openssl ca -batch -config ${SUBCA_CONFIG} -policy signing_policy -extensions signing_req -out ${CLIENT_CERT} -infiles ${CLIENT_CSR}
サーバー証明書は次のようになります。
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=DE, O=Company, CN=SubCA 2016
Validity
Not Before: Oct 20 12:18:18 2016 GMT
Not After : Oct 20 12:18:18 2018 GMT
Subject: C=DE, ST=Bayern, L=Mytown, O=Company, OU=OU, CN=My Server
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
53:C6:01:AB:E4:AA:C4:A4:BC:8B:2D:45:9C:92:40:5D:59:B7:AD:A0
X509v3 Authority Key Identifier:
keyid:43:2E:0E:EB:66:C6:2F:AC:1B:24:C7:95:48:92:95:6E:E3:E0:83:1E
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl.url.de/some.crl
Authority Information Access:
CA Issuers - URI:http://some.url.de/rootcacert2016.cert
X509v3 Extended Key Usage:
TLS Web Client Authentication
X509v3 Subject Alternative Name:
DNS:localhost, DNS:127.0.0.1, DNS:some.url.de
Signature Algorithm: sha256WithRSAEncryption
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
次に、生成された証明書を確認します。これはメッセージで失敗します
エラー2 at 1深度ルックアップ:発行者証明書を取得できません
SubCAとCAファイルを単一のファイルに連結した場合、正しく検証された場合。これも正しいですか?証明書が各証明書で検証可能であることを期待していますか?
そして今、私の問題:サービスに接続しようとすると、サーバー証明書が提供されます。確かにwiresharkで確認しました。その後、クライアントはメッセージによる認証に失敗します
「リクエストされたターゲットへの有効な証明書パスが見つかりません」
サーバー証明書をPKCS12トークンとしてエクスポートし、それをmy Java keystoreにインポートしました。ca/ subca証明書をトラストストアにインポートしました。これはサーバーによって期待どおりに表示されます。したがって、私は混乱していると思います証明書チェーンをどうにかしてアップします。連結された証明書ファイルはopensslでうまく機能したので、それをトラストストアにインポートしようとしました。これにより、subca証明書のみが存在するようになり、これが機能するようになりました。両方を個別にインポートすると、証明書リストは問題ありませんが、証明書のパスがどういうわけか正しくありません。手を貸してくれませんか?少し不満を感じています...
更新:これはルート証明書です:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 13418448032209606381 (0xba37e7642ce496ed)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=DE, O=Company, CN=IDS Root CA 2016
Validity
Not Before: Oct 20 11:59:57 2016 GMT
Not After : Oct 15 11:59:57 2036 GMT
Subject: C=DE, O=Fraunhofer, CN=IDS Root CA 2016
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
19:6B:27:27:F8:9F:56:E3:07:E7:AB:51:1E:15:DC:F8:F1:96:D5:35
X509v3 Authority Key Identifier:
keyid:19:6B:27:27:F8:9F:56:E3:07:E7:AB:51:1E:15:DC:F8:F1:96:D5:35
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage:
Non Repudiation, Certificate Sign, CRL Sign
Signature Algorithm: sha1WithRSAEncryption
...
これはサーバー証明書を作成するための私の設定ファイルです:
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ req ]
default_bits = 2048
#default_keyfile = connector.key
distinguished_name = connector_distinguished_name
req_extensions = connector_req_extensions
string_mask = utf8only
####################################################################
[ connector_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = DE
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Bayern
localityName = Locality Name (eg, city)
localityName_default = Muenchen
organizationName = Organization Name (eg, company)
organizationName_default = Company
organizationalUnitName = Organizational Unit Name (department, division)
organizationalUnitName_default = OU
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test Server
emailAddress = Email Address
emailAddress_default = [email protected]
####################################################################
[ connector_req_extensions ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment, nonRepudiation
extendedKeyUsage = clientAuth
#securityProfile = ASN1:UTF8:IDS Security Profile Specification
#subjectAltName = URI:UUID:%%DEVICE_UUID%%
subjectAltName = @alternate_names
[ alternate_names ]
DNS.1 = localhost
DNS.2 = 127.0.0.1
DNS.3 = some.url.com
ようやく解決策を見つけました。デバッグをSSLに設定するだけです。これは私の間違いでした。デバッグ出力を「すべて」に設定する必要があったでしょう。それから私はこのエラーメッセージを見ることができます:
原因:Sun.security.validator.ValidatorException:拡張キーの使用がTLSサーバー認証の使用を許可していません
これはより具体的です。それを修正するために、確かに私は拡張キーの使用法をこれに変更する必要がありました:
keyUsage = digitalSignature, keyEncipherment, nonRepudiation
extendedKeyUsage = clientAuth, serverAuth
どうもありがとうございました!