web-dev-qa-db-ja.com

サーバーが証明書を提示しているかどうかを確認するOpenSSLコマンド

私たちのシステムからアウトバウンドメッセージを送信しようとするときに、SSL問題が何であるかを絞り込むためにopensslコマンドを実行しようとしています。

別のトピックでこのコマンドを見つけました: opensslを使用してサーバーから証明書を取得する

openssl s_client -connect ip:port -prexit

この結果は次のようになります

CONNECTED(00000003)
15841:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 121 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

これは、サーバーが証明書を提示していないことを意味しますか?別のip:portで他のシステムを試したところ、証明書が正常に提示されました。

相互認証は-prexitを使用してこのコマンドに影響しますか?

- 更新 -

もう一度コマンドを実行しました

openssl s_client -connect ip:port -prexit

そして、私は今、この応答を受け取ります

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 121 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

コマンドに-ssl3を追加しました

openssl s_client -connect ip:port -prexit -ssl3

応答:

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : SSLv3
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    Krb5 Principal: None
    Start Time: 1403907236
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

-tls1も試行しています

CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    Krb5 Principal: None
    Start Time: 1403907267
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---
49
R Zeal

今日、同じwrite:errno=104エラーが発生するSSLの問題をデバッグしていました。最終的に、この動作の理由は、サーバーが正しく動作するためにSNIが必要servername TLS拡張)であることがわかりました。 opensslに-servernameオプションを指定すると、正常に接続されました:

openssl s_client -connect domain.tld:443 -servername domain.tld

お役に立てれば。

71
piit79
15841:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:
...
SSL handshake has read 0 bytes and written 121 bytes

これはハンドシェイクの失敗です。反対側は、データを送信せずに接続を閉じます(「0バイトの読み取り」)。反対側がSSLをまったく話さない可能性があります。しかし、壊れたSSL実装で同様のエラーが発生しました。これは、新しいSSLバージョンを理解していません。 -ssl3をs_clientのコマンドラインに追加して、SSL接続を取得するか試してください。

9
Steffen Ullrich

私の場合、SSL証明書はすべてのサイトに対して構成されていません(非wwwバージョンがリダイレクトされたwwwバージョンに対してのみ)。私はLaravelフォージと Nginx Boilerplate config を使用しています

私はnginxサイトに次の設定をしました:

/ etc/nginx/sites-available/timtimer.at

server {
    listen [::]:80;
    listen 80;
    server_name timtimer.at www.timtimer.at;

    include h5bp/directive-only/ssl.conf;

    # and redirect to the https Host (declared below)
    # avoiding http://www -> https://www -> https:// chain.
    return 301 https://www.timtimer.at$request_uri;
}

server {
    listen [::]:443 ssl spdy;
    listen 443 ssl spdy;

    # listen on the wrong Host
    server_name timtimer.at;

    ### ERROR IS HERE ###
    # You eighter have to include the .crt and .key here also (like below)
    # or include it in the below included ssl.conf like suggested by H5BP

    include h5bp/directive-only/ssl.conf;

    # and redirect to the www Host (declared below)
    return 301 https://www.timtimer.at$request_uri;
}

server {
    listen [::]:443 ssl spdy;
    listen 443 ssl spdy;

    server_name www.timtimer.at;

    include h5bp/directive-only/ssl.conf;

    # Path for static files
    root /home/forge/default/public;

    # FORGE SSL (DO NOT REMOVE!)
    ssl_certificate /etc/nginx/ssl/default/2658/server.crt;
    ssl_certificate_key /etc/nginx/ssl/default/2658/server.key;

    # ...

    # Include the basic h5bp config set
    include h5bp/basic.conf;
}

そのため、次の部分を/ etc/nginx/h5bp/directive-only/ssl.confファイルに移動(カットアンドペースト)した後、すべてが期待どおりに機能しました。

# FORGE SSL (DO NOT REMOVE!)
ssl_certificate /etc/nginx/ssl/default/2658/server.crt;
ssl_certificate_key /etc/nginx/ssl/default/2658/server.key;

したがって、wwwバージョンを直接呼び出すだけの場合でも、wwwバージョンのみにキーを指定するだけでは不十分です。

私たちのプロキシは自己署名証明書でHTTPS接続を書き換えるので、私はgithub.comに出ようとして以下を取得していました:

利用可能なピア証明書がありませんクライアント証明書がありませんCA名が送信されました

私の出力には次のものもありました:

プロトコル:TLSv1.3

-tls1_2を追加しましたが、正常に機能し、送信要求でどのCAを使用しているかを確認できます。例えば。:
openssl s_client -connect github.com:443 -tls1_2

0
Elijah Lynn