LoginSignup
2
2

More than 5 years have passed since last update.

ブラウザのPOODLE脆弱性を調べるための簡単なサーバー

Last updated at Posted at 2015-08-29

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)
    }
}

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2