我想使用TLS相互身份验证来验证go制成的API上的客户端。我创建了一个证书颁发机构,假设鲍勃有一个他想与客户端一起使用的密钥对。鲍勃(Bob)创建了一个证书请求,希望我验证他的证书,以便在API上进行授权和身份验证。
我用它来创建我的证书颁发机构:
openssl genrsa -aes256 -out ca.key 4096 openssl req -new -x509 -sha256 -days 730 -key ca.key -out ca.crt
Bob用它来创建他的证书和证书请求:
openssl genrsa -out bob.key 4096 openssl req -new -key bob.key -out bob.csr
我想实现这一目标,但是请继续:
openssl x509 -req -days 365 -sha256 -in bob.csr -CA ca.crt -CAkey ca.key -set_serial 3 -out bob.crt
现在,通过这些命令,Bob可以使用此tls.Config创建到我的API的TLS连接:
func createTLSConfig(certFile string, keyFile string, clientCAFilepath string) (config *tls.Config, err error) { cer, err := tls.LoadX509KeyPair(certFile, keyFile) if err != nil { return nil, err } clientCAFile, err := ioutil.ReadFile(clientCAFilepath) if err != nil { return nil, err } clientCAPool := x509.NewCertPool() clientCAPool.AppendCertsFromPEM(clientCAFile) config = &tls.Config{ Certificates: []tls.Certificate{cer}, ClientAuth: tls.RequireAndVerifyClientCert, ClientCAs: clientCAPool, CipherSuites: []uint16{ tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, }, PreferServerCipherSuites: true, SessionTicketsDisabled: false, MinVersion: tls.VersionTLS12, CurvePreferences: []tls.CurveID{tls.CurveP521, tls.CurveP384}, } return config, nil }
但是,如果茱莉亚现在想登录怎么办?她将必须创建一个CSR,并将其发送给我,我也必须手动将其CSR验证到CRT。为了避免手动操作,我们的想法是拥有一个注册端点,Julia可以在该端点上提交她的CSR并取回有效的CRT。端点基本上看起来像这样:
func Register(c echo.Context) (err error) { // get Julia's csr from POST body csr := certificateFromBody(c.Body) // valid csr with ca to generate the crt crt := signCSR(csr, config.ClientCAPath) // return the crt to julia return c.JSON(http.StatusCreated, base64.StdEncoding.EncodeToString(crt)) }
我花了一些时间来了解opensl如何使用CA从CRS创建CRT,但没有成功。
Golang有一个来自crypto / x509包的CertificateRequest对象,我可以使用ParseCertificateRequest创建它,但是我找不到使用该对象和我的CA并返回证书的函数。
谢谢您的帮助!
您可能可以使用x509.CreateCertificate。
CreateCertificate的参数之一是“模板”证书。
您可以使用Julia’s CertificateRequest中的字段来设置模板证书的字段。
Go的生成证书脚本显示了用法CreateCertificate的示例。
这假定来自Julia的API请求实际上来自Julia,并且具有足够的信任度以对请求签名并返回证书。
此外,在Go中将自己的PKI用于TLS可能会有所帮助。