web-dev-qa-db-ja.com

クライアント証明書はクライアントから信頼される必要がありますか?

クライアント証明書の信頼要件(ある場合)についての説明を探しています。

第三者と協力して、相互TLS経由でサービスにアクセスしています。

CSRを生成し、サードパーティに送信します。彼らは私に証明書(独自のCAを使用して生成したもの)を送信します。単一の証明書です。私は中間証明書を提供されていません-私が想定しているようにクライアント証明書認証要求を発行するためにこれらは必要ありません

この証明書で接続しようとすると、ハンドシェイクに失敗します。

openssl s_client -connect the-server.com:443 -cert the-cert.pem -key the-key.pem -state
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
depth=2 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
verify error:num=20:unable to get local issuer certificate
verify return:0
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server certificate request A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write certificate verify A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL3 alert read:fatal:handshake failure
SSL_connect:failed in SSLv3 read finished A
78460:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:/BuildRoot/Library/Caches/com.Apple.xbs/Sources/OpenSSL098/OpenSSL098-59/src/ssl/s3_pkt.c:1145:SSL alert number 40
78460:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/BuildRoot/Library/Caches/com.Apple.xbs/Sources/OpenSSL098/OpenSSL098-59/src/ssl/s23_lib.c:185:

「pemファイルには、クライアント証明書に署名した公開CA証明書が含まれていません」ただし、これがこの場合、クライアントは、証明書を信頼する必要がある場合、証明書を送信しますか(上記のTLSネゴシエーション手順で送信しているように見えます)。

9
Mark Kelly

クライアント証明書はクライアントから信頼される必要がありますか?

いいえ、クライアント証明書はサーバーによってのみ検証され、サーバー証明書はクライアントによってのみ検証されます。したがって、クライアント証明書またはその署名CAに関するあらゆる種類の信頼は、サーバーでのみ必要です。

...中間証明書なしの単一の証明書です

... pemファイルに、クライアント証明書に署名した公開CA証明書が含まれていない

最初のステートメントが間違っていることをお勧めします。つまり、取得した証明書は実際には中間CAによって署名されており、必要なチェーン証明書が含まれていませんでした。ルート証明書自体は送信しないでください。これらの証明書は、検証を実行する側、つまりクライアント証明書の場合はサーバーで信頼済みとして存在する必要があるためです。

サーバー側で事前に信頼されているCAを確認し、これを証明書の発行者と比較することをお勧めします。それらが一致しない場合、チェーン証明書が欠落しています。それらが一致する場合は、サーバー側の設定に問題がある可能性があります。つまり、クライアント認証のためにサーバーによって信頼されている必要なCAが構成されていない可能性があります。

8
Steffen Ullrich

いいえ、クライアントはサーバーに提示する証明書を信頼する必要はありません。 (サーバーは、クライアントに提示する証明書も信頼する必要はありません)。接続の反対側のみが、提示された証明書を検証できる必要があります。

つまり、クライアントが使用する秘密鍵と証明書は一致する必要があります。次のコマンドを使用して確認できます。

openssl rsa -in localhost.key -modulus -noout openssl x509 -in localhost.crt -modulus -nooutそれらの出力は正確に一致する必要があります。

サーバーmayは、クライアントがユーザー証明書の信頼性を検証するために必要な中間CA証明書を送信することを期待しますが、これはvery奇妙で基本的に前代未聞。

最後に、新しいシステムを導入する場合は、OpenSSL 0.9.8を使用することをしないことを強くお勧めします。 年末

4
Hubert Kario

クライアント証明書が内部CAによって発行されている場合、接続されているサーバーは、クライアント証明書を検証できるように内部CAを「信頼」する必要があります。

クライアントが内部CAの公開証明書を提示できたとしても、信頼されたルートの1つ(つまり、多くの公開CAの1つである...ベリサイン、コモドなど)によって署名されていないため、サーバーは証明書を信頼しません。

サーバー管理者は、サーバーのトラストストアに内部CAの証明書(つまり、クライアント証明書のルート)をインストールする必要があります。

1
R15