私たちのシステムからアウトバウンドメッセージを送信しようとするときに、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)
---
今日、同じwrite:errno=104
エラーが発生するSSLの問題をデバッグしていました。最終的に、この動作の理由は、サーバーが正しく動作するためにSNIが必要(servername
TLS拡張)であることがわかりました。 opensslに-servername
オプションを指定すると、正常に接続されました:
openssl s_client -connect domain.tld:443 -servername domain.tld
お役に立てれば。
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接続を取得するか試してください。
私の場合、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