Openssl만 사용하여 웹 사이트에서 지원하는 SSL cipher suite 파악하기

보통 웹 사이트의 SSL에 대한 보안적인 체크는 잘 나와있는 여러 도구들이 있어서 쉽게 테스트할 수 있습니다.

가끔 이러한 도구 없이 기본적인 환경에서만 테스트해야할 경우가 있을텐데 찾아본김에 정리해서 글로 남겨봅니다.

Enum cipher suite using only openssl

보통 openssl을 통해 tls 포트로 접근 시 s_client 옵션과 -connect 플래그를 사용합니다. 이 때 연결 정보를 보고 많은걸 체크할 수 있지만, 지원하는 cipher suite 리스트를 얻지는 못합니다. 그래서 -cipher 플래그로 테스트할 cipher suite를 직접 지정해주고, 리턴 값을 보고 해당 서버가 지원하는지 안하는지 알 수 있습니다.

test.sh

SERVER=$1
DELAY=1
ciphers=$(openssl ciphers 'ALL:eNULL' | sed -e 's/:/ /g')

echo Enum cipher list from $(openssl version).
echo "========================"

for cipher in ${ciphers[@]}
do
result=$(echo -n | openssl s_client -cipher "$cipher" -connect $SERVER 2>&1)
if [[ "$result" =~ ":error:" ]] ; then
    a=1
else
  if [[ "$result" =~ "Cipher is ${cipher}" || "$result" =~ "Cipher    :" ]] ; then
    echo ${cipher}
  fi
fi
sleep $DELAY
done

Run

./test.sh www.hahwul.com:443

Other ways

그냥 쓰기엔 너무 짧아서 같이 기록해둡니다.

testssl.sh

./testssl.sh www.hahwul.com:443
... snip ...
TLSv1.2 (server order)
 xc02f   ECDHE-RSA-AES128-GCM-SHA256       ECDH 253   AESGCM      128      TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
 xc030   ECDHE-RSA-AES256-GCM-SHA384       ECDH 253   AESGCM      256      TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
 xcca8   ECDHE-RSA-CHACHA20-POLY1305       ECDH 253   ChaCha20    256      TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
 xc027   ECDHE-RSA-AES128-SHA256           ECDH 253   AES         128      TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
 xc028   ECDHE-RSA-AES256-SHA384           ECDH 253   AES         256      TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
 xc013   ECDHE-RSA-AES128-SHA              ECDH 253   AES         128      TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
 xc014   ECDHE-RSA-AES256-SHA              ECDH 253   AES         256      TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
 x9c     AES128-GCM-SHA256                 RSA        AESGCM      128      TLS_RSA_WITH_AES_128_GCM_SHA256
 x2f     AES128-SHA                        RSA        AES         128      TLS_RSA_WITH_AES_128_CBC_SHA
 x35     AES256-SHA                        RSA        AES         256      TLS_RSA_WITH_AES_256_CBC_SHA
TLSv1.3 (no server order, thus listed by strength)
 x1302   TLS_AES_256_GCM_SHA384            ECDH 253   AESGCM      256      TLS_AES_256_GCM_SHA384
 x1303   TLS_CHACHA20_POLY1305_SHA256      ECDH 253   ChaCha20    256      TLS_CHACHA20_POLY1305_SHA256
 x1301   TLS_AES_128_GCM_SHA256            ECDH 253   AESGCM      128      TLS_AES_128_GCM_SHA256
... snip ...
 FS is offered (OK)           TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-SHA384
                             ECDHE-RSA-AES256-SHA ECDHE-RSA-CHACHA20-POLY1305 TLS_AES_128_GCM_SHA256 ECDHE-RSA-AES128-GCM-SHA256
                             ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA
... snip ...

sslyze

sslyze www.hahwul.com:443
.. snip ...
* TLS 1.2 Cipher Suites:
    Attempted to connect using 156 cipher suites.

The server accepted the following 10 cipher suites:
   TLS_RSA_WITH_AES_256_CBC_SHA                      256
   TLS_RSA_WITH_AES_128_GCM_SHA256                   128
   TLS_RSA_WITH_AES_128_CBC_SHA                      128
   TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256       256       ECDH: X25519 (253 bits)
   TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384             256       ECDH: prime256v1 (256 bits)
   TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384             256       ECDH: prime256v1 (256 bits)
   TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA                256       ECDH: prime256v1 (256 bits)
   TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256             128       ECDH: prime256v1 (256 bits)
   TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256             128       ECDH: prime256v1 (256 bits)
   TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA                128       ECDH: prime256v1 (256 bits)
... snip ...
* TLS 1.3 Cipher Suites:
    Attempted to connect using 5 cipher suites.

    The server accepted the following 3 cipher suites:
       TLS_CHACHA20_POLY1305_SHA256                      256       ECDH: X25519 (253 bits)
       TLS_AES_256_GCM_SHA384                            256       ECDH: X25519 (253 bits)
       TLS_AES_128_GCM_SHA256                            128       ECDH: X25519 (253 bits)

ZAP

HTTPSInfo 확장 기능으로도 쉽게 체크할 수 있습니다.

References