web-dev-qa-db-ja.com

特定のSSL暗号を強制する

特定のSSL暗号を使用してHTTPS Webサイトに接続し、出力を表示するにはどうすればよいですか?

これは、脆弱性分析を実行し、誤検知を取り除くときに役立ちます。たとえば、デバイスが弱い暗号をサポートしていることをアドバタイズするが、強力な暗号を使用する必要があることを通知するページを表示する場合などです。

13
Sonny Ordell

あなたが求めていることを行う最も簡単な方法は、 openssl s_client を使用して、制限された暗号でサイトに接続することですリスト。そして実際、同じアプローチは多くのツールで機能します-確かにほとんどのプログラミング言語やスクリプト言語(Python(@ terry-chiaが示唆しているように)、Perl、tcl、C ...)とブラウザー(いくつか- ここで役立つ解説 )。

Opensslでこれを行う方法を見ていきましょう。

試行する暗号を決定します

ツール sslscan を使用して、特定のサイトが受け入れるまたは拒否する暗号を決定できます。

$ sslscan www.google.com | grep Rejected | head -1
    Rejected  SSLv3  256 bits  ECDHE-ECDSA-AES256-SHA
$ sslscan www.google.com | grep Accepted | head -1
    Accepted  SSLv3  256 bits  ECDHE-RSA-AES256-SHA
$ 

そして、これはwww.google.comが拒否する1つの暗号とそれを受け入れる1つの暗号を私たちに伝えました。これで、openssl s_clientで両方をテストできます。

拒否された暗号のテスト

Opensslに「-cipher」引数を使用するだけで、クライアントがサポートする暗号スイートを、テストする1つの暗号に制限できます。ここでは、sslscanによってRejectedとマークされているものを選択します。

$ openssl s_client -cipher 'ECDHE-ECDSA-AES256-SHA' -connect www.google.com:443
CONNECTED(00000003)
140465833367232:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:741:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 127 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---
$

上部にハンドシェイクの失敗があり、その後「Cipher is(NONE)」が表示されます。これは、サーバーが、指定した1つの暗号のみをネゴシエートしているクライアントに同意することを望まなかったことを明確に示しています。これは、特定のSSL暗号に接続して「出力を表示したい」と言ったときの意味だと思います。

受け入れられた暗号のテスト

ここで、サーバーがサポートしていることがわかっている暗号を使用して同じことを行うと、完全な接続が行われていることがわかり、HTTPコマンドを入力できます。出力の下に、気付いたことをいくつかリストします。

$ openssl s_client -cipher 'ECDHE-RSA-AES256-SHA' -connect www.google.com:443
CONNECTED(00000003)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
   i:/C=US/O=Google Inc/CN=Google Internet Authority G2
 1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
   i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
   i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEdjCCA16gAwIBAgIIRYUpUVjSfHQwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
...
OEK3nH1sBk2Hy5ZBcyludHyUzqTHsXSjnIjwZNPpihVmFrs5I1Ma7iEj
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
issuer=/C=US/O=Google Inc/CN=Google Internet Authority G2
---
No client certificate CA names sent
---
SSL handshake has read 3750 bytes and written 277 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.1
    Cipher    : ECDHE-RSA-AES256-SHA
    Start Time: 1385691323
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
TRACE / HTTP/1.0

HTTP/1.0 405 Method Not Allowed
Content-Type: text/html; charset=UTF-8
Content-Length: 960
Date: Fri, 29 Nov 2013 02:15:31 GMT
Server: GFE/2.0
...

次の兆候に注意してください。

  1. 「ハンドシェイクに失敗しました」というエラーメッセージが表示されない
  2. 「新規、(なし)、暗号は(なし)」の代わりに、「新規、TLSv1/SSLv3、暗号はECDHE-RSA-AES256-SHA」と表示されます。
  3. また、SSL-Sessionセクションの下に同じ暗号がリストされています。
  4. HTTPコマンド「TRACE/HTTP/1.0」を入力した場所と、Googleが「HTTP/1.0 405 Method Not Allowed」と応答した場所を確認できます。明らかに暗号が拒否された場合、これを実行したり、これを確認したりすることはできません。 SSL接続が正常に確立された場合にのみ、HTTPサーバーと通信できます。

注意事項

これはopensslコマンドラインで比較的簡単です。使用する言語とライブラリによっては、コードでそれを実行するのが難しくなる場合があります。ブラウザでこれを行うと、そのようなきめの細かい制御にすぐにアクセスできないため、痛みを伴う可能性があります。たとえば、ChromeがWindowsのSSLにOSを使用している場合、レジストリキーを理解する必要があります。 SSLの操作に使用されます。

もう1つの問題は、テストする暗号文字列を特定することです。別のツールのレポートを調査している場合、質問が示唆しているように、OpenSSL暗号文字列の観点から見た暗号の問題を説明しているのではないでしょう。電話で「サポートが弱い正確には、「弱い暗号」と言ったときに何を指しているのですか?」

19
gowenfawr