web-dev-qa-db-ja.com

証明書検証の心配

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
1
Fluffy

ようやく解決策を見つけました。デバッグをSSLに設定するだけです。これは私の間違いでした。デバッグ出力を「すべて」に設定する必要があったでしょう。それから私はこのエラーメッセージを見ることができます:

原因:Sun.security.validator.ValidatorException:拡張キーの使用がTLSサーバー認証の使用を許可していません

これはより具体的です。それを修正するために、確かに私は拡張キーの使用法をこれに変更する必要がありました:

keyUsage            = digitalSignature, keyEncipherment, nonRepudiation
extendedKeyUsage    = clientAuth, serverAuth

どうもありがとうございました!

2
Fluffy