POODLE脆弱性がSSL 3.0からTLS 1.0 / TLS 1.1に拡大 | ブログ | SSL・電子証明書ならGMOグローバルサイン
昨年からPOODLE脆弱性っていうのが世の中を騒がせていますが、
SSLv3のサポートを切ったときの挙動やブラウザのTLS1.2の対応状況を調べて欲しいみたいなことは言われていませんか?
最新のブラウザの情報やメジャーなブラウザについては十分な情報が集まるかと思いますが、シェアの低いマイナーなブラウザについては情報を集めるよりも実際に動作確認したほうが早いかもしれません。
そんなケースがあったので今回のサーバーを書いてみました。
* server.key server.crtの作成方法は割愛します。
$ ls
server.key server.crt server.go
SSSL3.0をサポートした状態でサーバーを起動します。
$ go run server.go -port=4443 -minprotocol=ssl30 -maxprotocol=ssl30
サーバーを起動した後は適当にhostsファイルを編集してブラウザからアクセスしてください。
上の状態で立ち上げたサーバーだとSSL3.0しかサポートしてない状態ですのでブラウザは接続に失敗して真っ白なページかエラーページが表示されると思います。
最後に、簡単に手元で動作確認出来るので他のエンジニアに気を使わず検証出来て便利ですよね。
一度コンパイル出来てしまえば簡単にどこの環境でも動かせるこの辺りがGoの魅力ですね。
package main
import (
"crypto/tls"
"flag"
"fmt"
"log"
"net/http"
"time"
)
type BaseHandler struct{}
func (bh *BaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hey World!")
}
var keyfile, crtfile string
var port int
var minprtcl, maxprtcl string
func init() {
flag.IntVar(&port, "port", 443, "listen port")
flag.StringVar(&keyfile, "keyfile", "server.key", "ssl server.key")
flag.StringVar(&crtfile, "crtfile", "server.crt", "ssl server.crt")
flag.StringVar(&minprtcl, "minprotocol", "tls10", "minimum negotiation protocol: ssl30, tls10, tls11, tls12")
flag.StringVar(&maxprtcl, "maxprotocol", "tls12", "maximum negotiation protocol: ssl30, tls10, tls11, tls12")
flag.Parse()
}
func convertTlSNumber(protocol string) uint16 {
var version uint16
switch protocol {
case "ssl30":
version = tls.VersionSSL30
case "tls10":
version = tls.VersionTLS10
case "tls11":
version = tls.VersionTLS11
case "tls12":
version = tls.VersionTLS12
default:
log.Fatal("Unknown Protocol: ", protocol)
}
return version
}
func main() {
mux := http.NewServeMux()
bh := &BaseHandler{}
mux.Handle("/hello", bh)
addr := fmt.Sprintf(":%d", port)
svr := http.Server{
Addr: addr,
Handler: mux,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
TLSConfig: &tls.Config{
// ClientAuth: tls.RequireAnyClientCert,
MinVersion: convertTlSNumber(minprtcl),
MaxVersion: convertTlSNumber(maxprtcl),
// Info: MAXのバージョンが優先される => Cap
},
}
log.Printf("Listening on " + svr.Addr)
// err := svr.ListenAndServe()
err := svr.ListenAndServeTLS(crtfile, keyfile)
if err != nil {
log.Fatal(err)
}
}