So-net無料ブログ作成

MacでGolangでhttpdでTLSでLet's Encryptを使ってみた。 [プログラミング]

まずGolangでセキュアなWebサーバを立ち上げるところからやってみる。最初はオレオレ証明書でやる。ブラウザで警告は出るだろうけど気にしない。

https://github.com/denji/golang-tls/blob/master/README.md

初めのコードは
package main

import (
    "net/http"
    "log"
)

func HelloServer(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("This is an example server.\n"))
}

func main() {
    http.HandleFunc("/hello", HelloServer)
    err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

で、simpleHttpd.goという名前をつけて、以下のコマンドを打ちました。オレオレ証明書。
openssl genrsa -out server.key 2048
openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650
go build simpleHttpd.go
./simpleHttpd


https://localhost/hello

でうまくいった。案の定、ブラウザのワーニングが出て面倒くさいけど。これってTLSのバージョンとかどうなっているんかな? curlで調べる。

https://qiita.com/Esfahan/items/53399964cb76cdb87e60

curl -s -v --tlsv1.0 https://localhost/hello


証明書がダメだというエラーが出るけど-kオプションで無視できるようだ。

http://www.turbolinux.com/support/document/knowledge/866.html

$ curl -k -s -v --tlsv1.0 https://localhost/hello
《中略》
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* SSL_write() returned SYSCALL, errno = 32
* Failed sending HTTP2 data
* nghttp2_session_send() failed: The user callback function failed(-902)
* Connection #0 to host localhost left intact

とエラーが出てくる。どうやらHTTP/2を使っている模様。HTTP1.1だと思っていたから手間が省けた。

http: TLS handshake error from [::1]:63217: remote error: tls: unknown certificate authority

サーバ側でも上記のエラーが出てる。HTTP2はTLS1.1は使わないっぽい。なもんでTLS1.2を使ってみる。

$ curl -k -s -v --tlsv1.2 https://localhost/hello
《中略》
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fa353000400)
> GET /hello HTTP/2
> Host: localhost
> User-Agent: curl/7.54.0
> Accept: */*
> 
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
< HTTP/2 200 
< content-type: text/plain
< content-length: 27
< date: Tue, 11 Dec 2018 23:56:58 GMT
< 
This is an example server.
* Connection #0 to host localhost left intact

はい、HTTP/2でTLS1.2を使っていることがわかりました。Golangの標準パッケージにHTTP/2がもう組み入れられていたんだね。いつだったんだろ。というか、TLSのバージョンはこういう方法でしか確かめられんのか…。




オレオレ証明書を使っているのも何なのでLet's Encryptを使ってみたいと思います。一度node.jsで使ったことがあるので、そのノウハウは使えるんじゃないかと思ってはいます。

brew install certbot


したら依存性で結構色々入れられた。あ〜入れられるコマンドの名前から違いますね。

長くなりそうなので、Let's Encryptは次の機会にします。

タグ:Golang
コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0