Skip to main content

Real World HTTP 第2版の6章を読んだ

Real World HTTP 第2版の5章を読んだ
の続編

Real World HTTP 第2版 ―歴史とコードに学ぶインターネットとウェブ技術
を買ったマスタカです

6章 Go言語によるHTTP1.1クライアントの実装
を読んだので新しく知ったことをまとめる

Goと言いながらOpenSSLの説明だったので案外役に立った


・OpenSSLでパスの確認方法
openssl version -d
OPENSSLDIR: “/private/etc/ssl”

 

・openssl.cnf
Basic Constraints: CA証明書かどうかを示す多値の拡張設定
pathlenは証明書チェーン内でこのCAに連なることができるCAの最大数を示す。したがって、pathlen:0のCAはエンドユーザー証明書への署名しかできず、他のCAに署名することはできない。
中間認証局を使うと時に数字が変わるっぽい
https://qiita.com/3244/items/8c7e6892efdb4e500be9

CA証明書: 電子証明書を発行する認証局自身の公開鍵が含まれた電子証明書。
https://www.geotrust.co.jp/support/glossary/ca_certificate.html

Key Usage:鍵の用途
Encipherment 鍵暗号
https://www.trustss.co.jp/smnSignature350.html
serverAuth SSL/TLS Webサーバ認証
clientAuth SSL/TLS Webクライアント認証
つまりCA用として使えるようにするための拡張設定は基本制約basicConstraints = CA:trueで、鍵の用途keyUsage = cRLSign, keyCertSignを追加する意味は、他の用途で使えなくすることでした。
https://qiita.com/3244/items/2a2a2dc6cd1e2e35beb9

CSR証明書署名要求、サーバ証明書発行の際に必ず必要となる、証明書署名要求と呼ばれるものです。 CSRはお客様のサーバ上で生成するもので、生成したCSRを認証機関に提出すると、認証機関がこれに署名をして、サーバ証明書を発行します。
http://www.comodo.jp/beginner/csr.html

 

・証明書の作り方
CA秘密鍵
CA秘密鍵から証明書要求CSRを作成
CSRファイルとは、SSL通信に利用する公開鍵暗号系の公開鍵に、コモンネームなどの情報を付加したものです。
CA証明書を自分の秘密鍵で署名してcrtを作成
CRTファイルとは、SSL証明書会社がCSRファイルに情報を付加して秘密鍵で暗号化したものです。サーバ証明書などとも呼ばれます。
サーバー秘密鍵
サーバー秘密鍵からサーバーCSRを作成
サーバーCSRとCA証明書とCAの秘密鍵からサーバー証明書を作成
https://install-memo.hatenadiary.org/entry/20110906/1315291837

 

・GolangでSSL
サーバーをGolangで作る

err := http.ListenAndServeTLS(":18443", "../ssl/server.crt", "../ssl/server.key", nil)

クライアントをcurlで実施
何もつけないとエラー

curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

以下だとうまくいく

curl https://localhost:18443 --cacert ca.crt

クライアントをGolangで作る
509にしてPemでcertを読み込んでTlsClientConfigにくっつける

cert, err := ioutil.ReadFile("../ssl/ca.crt")
if err != nil {
	panic(err)
}
certPool := x509.NewCertPool()
certPool.AppendCertsFromPEM(cert)
tlsConfig := &tls.Config{
	RootCAs: certPool,
}
tlsConfig.BuildNameToCertificate()

client := &http.Client{
	Transport: &http.Transport{
		TLSClientConfig: tlsConfig,
	},
}

クライアントで普通に実行すると動かない
そのため、実行時に環境変数つける

env GODEBUG=x509ignoreCN=0    ./http

 

TLSやらOpenSSLは全然理解してなかったのでとても勉強になりました
まだまだ続くよ

関連記事:

Pocket