見出し画像

Go言語でPKI入門 9日目:SCEPサーバーも作ってみた

今朝は3時に自力で起きました。助手の猫さんは、かみさんと寝てましたが6時ぐらいに起きて「休憩!」と大騒ぎしました。おかげで、少し休憩できました。

ACMEサーバーのデバイスチャレンジもいちおう移植できました。TPMを使うには、TPMのルート証明書を読み込む必要があるようです。AppleとYubiKeyのルート証明書は組み込みになっています。これもDNSと同じようにテスト方法がわからないので作っただけで保留にしています。

今朝は、まずSCEPの学習をしました。RFC

を読んでプロトコルのイメージをつかむためにマインドマップを描いてみました。

ACMEより簡単そうです。
HTTPSではなくHTTPのサーバーでよいみたいです。
stecp caのSCEPサーバーのソースコードを読んで写経してみました。こちらは、ACMEとは別の人が作ったのかもしれませんが、より難解な気がしました。何とか読み解いて移植していたのですが、step caの内部で使っているパッケージより、公開されているパッケージ

のほうがスッキリしていたので、こちらを使うように書き換えました。
以前調べた時、このパッケージのサーバーのサンプルコード

/ read a request body containing SCEP message
body, err := ioutil.ReadAll(r.Body)
if err != nil {
    // handle err
}

// parse the SCEP message
msg, err := scep.ParsePKIMessage(body)
if err != nil {
    // handle err
}

// do something with msg
fmt.Println(msg.MessageType)

// extract encrypted pkiEnvelope
err := msg.DecryptPKIEnvelope(CAcert, CAkey)
if err != nil {
    // handle err
}

// use the CSR from decrypted PKCS request and sign
// MyCSRSigner returns an *x509.Certificate here
crt, err := MyCSRSigner(msg.CSRReqMessage.CSR)
if err != nil {
    // handle err
}

// create a CertRep message from the original
certRep, err := msg.Success(CAcert, CAkey, crt)
if err != nil {
    // handle err
}

// send response back
// w is a http.ResponseWriter
w.Write(certRep.Raw)

の意味がよくわかりませんでしたが、RFCを読んで、step caのSCEPサーバーのコードを読んだ後だとよく理解できました。

SCEPサーバーもいちおう、できましたが、テスト方法がわからないので、保留です。

Go言語でPKI入門で必要なことは習得できたはずなので終わりにして、まとめの記事を書こうと思います。

明日に続く

いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。