2016-04-06 9 views
1

サーバーとのハンドシェイクが可能な暗号スイートを確認しようとしています。SSL/TLS暗号スイートとそのOpenSSLマップの対応

$./ciphers.sh stackoverflow.com:443 
stackoverflow.com:443,SSL2(),SSL3(),TLS1(ECDHE-RSA-AES256-SHA:AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA),TLS1.1(ECDHE-RSA-AES256-SHA:AES256-SHA:ECDHE-RSA-AES128-SHA:AES128-SHA),TLS1.2(ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:AES128-SHA256:AES128-SHA) 

私はどのように把握することはできません:私はOpenSSLを呼び出して、彼に代わって、ポストの終わりに、スクリプトを使用していますし、出力はスイートnames.For例ののOpenSSL equvalentsでありますそれらをSSL/TLS暗号スイート名でマップします。私は必要なの

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 
TLS_DHE_RSA_WITH_AES_128_CBC_SHA 
TLS_RSA_WITH_AES_128_CBC_SHA  
TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 
SSL_RSA_WITH_3DES_EDE_CBC_SHA 

のように、暗号名のリストですが、私はちょうどそれを把握することはできません...あなたの助けと時間をありがとう!

#!/usr/bin/env bash 
ciphers2=$(openssl ciphers -ssl2 'ALL:eNULL' | sed -e 's/:/ /g') 
ciphers3=$(openssl ciphers -ssl3 'ALL:eNULL' | sed -e 's/:/ /g') 
cipherst1=$(openssl ciphers -tls1 'ALL:eNULL' | sed -e 's/:/ /g') 
cipherst11=$(openssl ciphers -tls1.1 'ALL:eNULL' | sed -e 's/:/ /g') 
cipherst12=$(openssl ciphers -tls1.2 'ALL:eNULL' | sed -e 's/:/ /g') 

SSL2="SSL2(" 
for cipher in ${ciphers2[@]} 
do 
result=$(echo -n | openssl s_client -ssl2 -cipher "$cipher" -connect $1 2>&1) 
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then 
    SSL2="${SSL2}${cipher}:" 
fi 
done 
SSL2=$(echo "${SSL2})" | sed -e 's/:)/)/g') 

SSL3="SSL3(" 
for cipher in ${ciphers3[@]} 
do 
result=$(echo -n | openssl s_client -ssl3 -cipher "$cipher" -connect $1 2>&1) 
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then 
    SSL3="${SSL3}${cipher}:" 
fi 
done 
SSL3=$(echo "${SSL3})" | sed -e 's/:)/)/g') 
TLS1="TLS1(" 
for cipher in ${cipherst1[@]} 
do 
result=$(echo -n | openssl s_client -tls1 -cipher "$cipher" -connect $1 2>&1) 
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then 
    TLS1="${TLS1}${cipher}:" 
fi 
done 
TLS1=$(echo "${TLS1})" | sed -e 's/:)/)/g') 

TLS11="TLS1.1(" 
for cipher in ${cipherst11[@]} 
do 
result=$(echo -n | openssl s_client -tls1_1 -cipher "$cipher" -connect $1 2>&1) 
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then 
    TLS11="${TLS11}${cipher}:" 
fi 
done 
TLS11=$(echo "${TLS11})" | sed -e 's/:)/)/g') 

TLS12="TLS1.2(" 
for cipher in ${cipherst12[@]} 
do 
result=$(echo -n | openssl s_client -tls1_2 -cipher "$cipher" -connect $1 2>&1) 
if [[ "$result" =~ "Cipher is ${cipher}" ]] ; then 
    TLS12="${TLS12}${cipher}:" 
fi 
done 
TLS12=$(echo "${TLS12})" | sed -e 's/:)/)/g') 

echo "$1,$SSL2,$SSL3,$TLS1,$TLS11,$TLS12"; 
+0

あなたはどんな出力を得ていますか?あなたは '-no_ssl2'や' -no_tls1_1'を使って、 'openssl'コマンドで使用していないプロトコルをすべて無効にすることもできます。そして、呼び出しごとに問題の暗号のようなデバッグデータを出してみてください。 –

+0

OpenSSLのどのバージョンを実行していますか? OpenSSL 1.0.2.fの '-ssl2'、' -ssl3'、 '-tls1'オプション以外のものは' openssl ciphers'とは見当たりません。 'ciphers'には' -tls1.1'や '-tls1.2'オプションはありません。 –

+0

opensslとRFC暗号名の間の変換はhttps://testssl.sh/openssl-rfc.mappping.htmlにあります。 –

答えて

1

名マッピング:OpenSSLはに関連する暗号スイート名の独自のセットを使用して、ほとんどの他の実装とドキュメントで使用されるRFCの中の名前と同じではありません。システム上のciphersのマニュアルページ(Unixライクな場合、bashは主にUnixライクなシステム上にありますが、他の人に移植可能ですが)の見出し "CIPHER SUITE NAMES"を参照してください。いくつかのシステムでは、man 1ssl ciphersのようなセクションを指定する必要があります。または、の場合は右のリンクを使用してください。適用外の場合は です(1.0.1以前は正式にサポートされていませんが、現在は404の場合は )。手動のOpenSSLにRFC名を変換する

:破棄(先頭)TLS又はSSL及び(埋め込み)WITH-に全て_を変更します。 keyexchangeが完全なRSA([EC] DH [E] -RSAでない)が完全にそれを破棄するところです。場合によってはDHEからEDH(旧バージョンのみ)を交換し、常にDH_anonからADHまたはECDH_anonからAECDHにスワップします。 3DES_EDE_CBCに変更すると、ほとんどケースからDES-CBC3に変わります。 EXPORTEXPを短くして先頭に移動します。 drop bitlengthsとCBCがある場合は、曖昧さを除去する必要はありません。

匿名のスイートは、提供されたデフォルトのリストには含まれていません。エクスポートスイートは、2015-03で1.0.0r 1.0.1mと1.0.2aからデフォルトで削除され、完全に削除され、2016-03で1.0.1sおよび1.0.2gから始まるデフォルトから削除されました。 3DES RC4 SEED IDEA CamelliaとDSS認証(別名DSA)は1.1.0ではデフォルトではありません。 SSL2プロトコルは1.0.0からデフォルトで無効になっており、2016-08年にリリースされた1.1.0では完全に削除されています。 SSL3は1.1.0でデフォルトでコンパイルされますが、他の欠陥があるRC4を除いてPOODLEによって壊れているため、これを使用しないでください。

可用性:暗号スイートは、OpenSSL 1.1.0以下の3つのクラスに分類されます。 SSL3以上のものTLS1.2用のものです。 SSL2は異なるコード体系を使用しているため、新しいプロトコルにSSL2スイートを使用することはできません。 TLS1.0はFortetzzaスイート(OpenSSLは実装されていない)を削除し、TLS1.1はエクスポートスイートを削除しましたが、OpenSSLは前述のようにそれらを許可しました。一方、TLS1.2では、新しいフォーマット(AEAD)と新しいPRF/KDFスキームが追加され、TLS1.2でのみ動作する新しい暗号スイートが追加されました。シングルDESとIDEA以外のTLS1.1からすべてを保持していました。

-ssl2 -ssl3 -tls1のオプションciphersの下に1.1。0は、フォーマットと互換性のあるスイートに限定され、すべてのSSL3-upスイートとTLS1.2スイートは-ssl3-tls1の両方に対応しています。再度manページを参照してください。 @Andrewは、-tls1.1または-tls1.2のオプションが、まだ実際には同じである-tls1_1-tls1_2(アンダースコアはドットではありません)を追加し、さらに-stdnameというオプションを追加して標準(RFC)マップの問題を回避しますが、行を非常に長くすると、IMHOは判読不能になります。

PS:もしあなたの目標が単に暗号を列挙する何らかの監査スキャンに合致する、または合格するのであれば、このアプローチが有効です。サーバーのセキュリティに関する有用な情報を確認したい場合は、ほとんど時間の無駄です。サーバーがSSL2またはSSL3 AT ALLを(すべての暗号スイートを使用して)実行せず、いくつかの暗号スイートをサポートしていて、悪い設定(このスキャンではテストしない)は適用されません。それを超えて正確にサポートされている暗号スイートは、良い認証キーと証明書チェーンを使用したり、ステイプルをしたりするなどのセキュリティよりはるかにセキュリティの問題です。テストすることはほとんど不可能であり、試していない良好なエフェメラルパラメータとランダム性を使用します。 5746やフォールバックのような機能をサポートし、ハートブレイドやCCSのようなバグはありませんが、これはテストしません。これはテストしない圧縮問題を回避または緩和し、一般にテスト可能ではない可能性があり、実際にテスト可能ではないBEASTに対するベストプラクティスとしてレコード分割を使用する。 SSL/TLSレベル以上のあらゆる問題が発生します。