opensslコマンドでWebサーバーがSSL/TLSのどのバージョンをサポートしているか調べる
code:bash
openssl s_client -connect localhost:8443 -ssl3
code:bash
openssl s_client -connect localhost:8443 -tls1
code:bash
openssl s_client -connect localhost:8443 -tls1_1
code:bash
openssl s_client -connect localhost:8443 -tls1_2
code:bash
openssl s_client -connect localhost:8443 -tls1_3
バージョン対応しているかの判断方法
ctrl + cが必要なコマンドが待機してしまう状態だとそのバージョンをサポートしているというふうに判断して良いと思う。反対にコマンドが出力してすぐに終了するときはサポートしていないと判断できそうだった。
ただ、より信頼できる判断方法としてちゃんと出力を読むこと。New, (NONE), ...となっていてNONEになっているためサポートしてないことを意味するらしい。
code:sh
$ openssl s_client -connect localhost:8443 -ssl3
CONNECTED(00000003)
140735924569096:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:365:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 0 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
以下の場合はNew, TLSv1/SSLv3 ...になっていて、TLS 1.0に対応しているということを示しているらしい。 code:sh
$ openssl s_client -connect localhost:8443 -tls1
CONNECTED(00000003)
depth=0 C = JP
verify error:num=18:self signed certificate
verify return:1
depth=0 C = JP
verify return:1
---
Certificate chain
0 s:/C=JP
i:/C=JP
---
Server certificate
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
subject=/C=JP
issuer=/C=JP
---
No client certificate CA names sent
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1267 bytes and written 333 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-SHA
Server public key is 2024 bit
...
以下のGoのコードのtlsConfigのコメントを切り替えれば再現できるはず。 code:go
package main
import (
"crypto/tls"
"fmt"
"log"
"net/http"
)
func main() {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
_, _ = fmt.Fprintln(w, "<h1>hello, world</h1>")
})
// Start HTTP server
fmt.Println("Listening...")
// TLS config
// NOTE: Switch by comment
//tlsConfig := &tls.Config{MinVersion: tls.VersionSSL30}
tlsConfig := &tls.Config{MinVersion: tls.VersionTLS10}
server := &http.Server{Addr: ":8443", Handler: handler, TLSConfig: tlsConfig}
// Start HTTPS server
if err := server.ListenAndServeTLS("./ssl_certs/server.crt", "./ssl_certs/server.key"); err != nil {
log.Fatal(err.Error())
}
}