DH鍵の鍵長が1024bit未満か判別するスクリプト

Firefox 39からDH鍵の鍵長が1024bit未満のchiper-suiteをサポートしているサイトを表示しようとすると下記のエラーが出るようになりました。

安全な接続ができませんでした

xxx.xxx.xxx.xxx への接続中にエラーが発生しました。SSL received a weak ephemeral Diffie-Hellman key in Server Key Exchange handshake message. (エラーコード: ssl_error_weak_server_ephemeral_dh_key) 

詳しくはこちら

とはいえ、いくつもサイトを管理していると一個一個ブラウザで確認するのはしんどいので、簡易的なチェックを行うスクリプトを作ってみました。

detect.sh

#!/bin/sh
COLOR_RED="\e[31;1m"
COLOR_GREEN="\e[32;1m"
COLOR_OFF="\e[m"

TEXT_OK=" ... [ ${COLOR_GREEN}OK${COLOR_OFF} ]"
TEXT_NG=" ... [ ${COLOR_RED}NG${COLOR_OFF} ]"

PORTS=(443 993 995 465 1194 8443)

while read f; do
  line=$f
  for (( I = 0; I < ${#PORTS[@]}; ++I ))
  do
    port=${PORTS[$I]}
    EDH=`echo "" | timeout 3 openssl s_client -connect ${line}:${port} -cipher "EDH" 2> /dev/null | grep "Server Temp Key" | awk -F'DH, ' '{print $2}' | awk -F' ' '{print $1}'`
    ECDHE=`echo "" | timeout 3 openssl s_client -connect ${line}:${port} -cipher "ECDHE" 2> /dev/null | grep "Server Temp Key" | awk -F', ' '{print $2}' | awk -F' ' '{print $1}'`
    EXPORT=`echo "" | timeout 3 openssl s_client -connect ${line}:${port} -cipher "EXP" 2> /dev/null | grep "Verify return code" | wc -l`
    echo -n ${line}:${port} ... EDH bits [${EDH}], ECDHE bits [${ECDHE}], EXPORT [${EXPORT}]

    if [ -n "${EDH}" ] && [ ${EDH} -lt 1024 ] ; then
      echo -n -e ${TEXT_NG}
    elif [ -n "${ECDHE}" ] && [ ${ECDHE} -lt 1024 ] ; then
      echo -n -e ${TEXT_NG}
    elif [ -n "${EXPORT}" ] && [ ${EXPORT} -gt 0 ] ; then
      echo -n -e ${TEXT_NG}
    else 
      echo -n -e ${TEXT_OK}
    fi
    echo ""
  done
done

使い方

echo "127.0.0.1" | sh detect.sh

# もしくはホスト名を改行区切りで羅列したlistというファイルを作成して

cat list | sh detect.sh