网站举报有奖平台,打开百度,做一个网站美工多少钱,wordpress添加顶部导航条本文为演示采用自签名证书一.生成证书通过openssl工具生成证书1.1 安装opensslmacos通过brew安装brew install openssl1.2 生成跟证书私钥openssl genrsa -out ca.key 40961.3 准备配置文件vim ca.conf内容如下[ req ]
default_bits 4096
distinguished_name req_disti…本文为演示采用自签名证书一.生成证书通过openssl工具生成证书1.1 安装opensslmacos通过brew安装brew install openssl1.2 生成跟证书私钥openssl genrsa -out ca.key 40961.3 准备配置文件vim ca.conf内容如下[ req ]
default_bits 4096
distinguished_name req_distinguished_name[ req_distinguished_name ]
countryName Country Name (2 letter code)
countryName_default CN
stateOrProvinceName State or Province Name (full name)
stateOrProvinceName_default JiangSu
localityName Locality Name (eg, city)
localityName_default NanJing
organizationName Organization Name (eg, company)
organizationName_default Sheld
commonName Common Name (e.g. server FQDN or YOUR name)
commonName_max 64
commonName_default Ted CA Test生成根证书签发申请文件(csr文件)openssl req -new -sha256 -out ca.csr -key ca.key -config ca.conf该命令含义如下req——执行证书签发命令-new——新证书签发请求-key——指定私钥路径-out——输出的csr文件的路径1.4 自签发根证书(cer文件)openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt该命令的含义如下x509——生成x509格式证书-req——输入csr文件-days——证书的有效期天-signkey——签发证书的私钥-in——要输入的csr文件-out——输出的cer证书文件1.5 生成服务端私钥openssl genrsa -out server.key 20481.6 准备配置文件得到server.confvim server.conf内容如下[ req ]
default_bits 2048
distinguished_name req_distinguished_name
req_extensions req_ext[ req_distinguished_name ]
countryName Country Name (2 letter code)
countryName_default CN
stateOrProvinceName State or Province Name (full name)
stateOrProvinceName_default JiangSu
localityName Locality Name (eg, city)
localityName_default NanJing
organizationName Organization Name (eg, company)
organizationName_default Sheld
commonName Common Name (e.g. server FQDN or YOUR name)
commonName_max 64
commonName_default server.com[ req_ext ]
subjectAltName alt_names[alt_names]
DNS.1 server.com生成服务端证书申请文件openssl req -new -sha256 -out server.csr -key server.key -config server.conf参考1.3输入服务端证书信息1.7 用CA证书签发服务端证书openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -extensions req_ext -extfile server.conf这里有必要解释一下这几个参数-CA——指定CA证书的路径-CAkey——指定CA证书的私钥路径-CAserial——指定证书序列号文件的路径-CAcreateserial——表示创建证书序列号文件(即上方提到的serial文件)创建的序列号文件默认名称为-CA指定的证书名称后加上.srl后缀1.8 生成客户端私钥openssl genrsa -out client.key 20481.9 准备配置文件得到client.confvim client.conf内容如下[ req ]
default_bits 2048
distinguished_name req_distinguished_name
req_extensions req_ext[ req_distinguished_name ]
countryName Country Name (2 letter code)
countryName_default CN
stateOrProvinceName State or Province Name (full name)
stateOrProvinceName_default HeNan
localityName Locality Name (eg, city)
localityName_default AnYang
organizationName Organization Name (eg, company)
organizationName_default Sheld_client
commonName Common Name (e.g. server FQDN or YOUR name)
commonName_max 64
commonName_default server.com[ req_ext ]
subjectAltName alt_names[alt_names]
DNS.1 server.com
DNS.2 localhost生成客户端证书申请文件openssl req -new -sha256 -out client.csr -key client.key -config client.conf1.10 用跟证书签发客户端证书openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -CAserial ca.srl -in client.csr -out client.crt -extensions req_ext -extfile client.conf需要注意的是上方签发服务端证书时已经使用-CAcreateserial生成过ca.srl文件因此这里不需要带上这个参数了。二. gin框架实现https服务端不需要验证客户端证书的示例2.1 项目引入gin框架go get -u github.com/gin-gonic/gin2.2 服务端代码package mainimport (github.com/gin-gonic/ginnet/http
)func main() {router : gin.New()router.GET(/test, func(c *gin.Context) {c.JSON(200, gin.H{message: success,})})// 可以直接用//router.RunTLS(0.0.0.0:10679, ./certs/server.cer, ./certs/server.key)server : http.Server{Addr: 0.0.0.0:10679, Handler: router}_ server.ListenAndServeTLS(./certs/server.cer, ./certs/server.key)
}
2.3 安全提示打开浏览器访问https://localhost:10679/test因为浏览器并不信任证书的颁发机构浏览器会有安全提示当然可以点高级直接强行访问页面同样可以返回结果很多文章也是到这里就结束了。强迫症的我还是要解决一下。2.4 给浏览器添加自己生成的CA证书本文选择firefox浏览器因为设置可以轻松添加信任CA证书。chrome则是直接掉起系统的证书没有找到友好的办法自己添加我们把CA证书(1.4节生成的ca.csr)添加到firefox证书颁发机构中去这样浏览器就信任我们自制的CA证书了。路径为设置-隐私与安全-查看证书-导入由于我们证书配置的common name是server.com因此需要修改本地hosts文件将下面文字添加到hosts文件中127.0.0.1 server.com再次访问https://server.com:10679/test不再阻止三.实现服务器和客户端双端验证3.1 服务端代码package mainimport (crypto/tlscrypto/x509fmtgithub.com/gin-gonic/ginio/ioutillognetnet/httposos/signalsyscall
)var (caCert string ./certs/ca.crtserverCert string ./certs/server.crtserverKey string ./certs/server.key
)func main() {router : gin.New()router.Use(gin.Logger())router.GET(/test, func(c *gin.Context) {c.JSON(200, gin.H{message: success,})})// 客户端CA证书certPool : x509.NewCertPool()ca, err : os.ReadFile(caCert)if err ! nil {fmt.Printf(load ca err: %s, err)return}if ok : certPool.AppendCertsFromPEM(ca); !ok {fmt.Printf(certpool append ca fail.)return}// 可以直接用注释的代码代替最后两行//router.RunTLS(0.0.0.0:10679, ./cert/server.cer, ./cert/server.key)server : http.Server{Addr: server.com:10679,Handler: router,TLSConfig: tls.Config{ClientAuth: tls.RequireAndVerifyClientCert,//这里一定要注意服务端设置ClientCAs用于服务端验证客户端证书客户端设置RootCAs用户客户端验证服务端证书。设置错误或者设置反了都会造成认证不通过。//RootCAs: certPool,ClientCAs: certPool,},}_ server.ListenAndServeTLS(serverCert, serverKey)
}3.2 客户端代码package mainimport (crypto/tlscrypto/x509fmtio/ioutillognet/httpos
)func main() {pool : x509.NewCertPool()caCrt, err : os.ReadFile(./certs/ca.crt)if err ! nil {log.Fatal(read ca.crt file error:, err.Error())}pool.AppendCertsFromPEM(caCrt)cliCrt, err : tls.LoadX509KeyPair(./certs/client.crt, ./certs/client.key)if err ! nil {log.Fatalln(LoadX509KeyPair error:, err.Error())}tr : http.Transport{TLSClientConfig: tls.Config{//这里一定要注意服务端设置ClientCAs用于服务端验证客户端证书客户端设置RootCAs用户客户端验证服务端证书。设置错误或者设置反了都会造成认证不通过。RootCAs: pool,//ClientCAs: pool,Certificates: []tls.Certificate{cliCrt},},}client : http.Client{Transport: tr}resp, err : client.Get(https://server.com:10679/test)if err ! nil {fmt.Printf(get failed. | err: %s\n, err)return}defer resp.Body.Close()body, err : ioutil.ReadAll(resp.Body)fmt.Println(string(body))}
四. 整理过程中遇到的bug4.1 tls: failed to verify certificate: x509: “server.com” certificate is not standards compliantremote error: tls: bad certificate这两个报错可能就是客户端或服务端设置参数ClientCAs、RootCAs错误有关。服务端设置ClientCAs里面保存客户端的CA证书Pool用于服务端验证客户端证书。客户端设置RootCAs里面保存服务端的CA证书Pool用户客户端验证服务端证书。设置错误或者设置反了都会造成认证不通过。这就属于知道就很简单解决但找不到错误就很崩溃本人因为这个小bug竟然熬了一夜说多了都是泪啊啊啊啊。。。4.2 use SANs or temporarily enable Common Name matching with GODEBUGx509ignoreCN0这个报错原因是生成证书没有开启SAN扩展go 1.15 版本开始废弃 CommonName因此推荐使用 SAN 证书。 这就是1.6、1.9两节配置文件最下面做的事情。重新把证书生成一下。当然自己生成的证书可以随便改如果线上证书出现这种情况我看有的说设置下环境变量GODEBUG 为 x509ignoreCN0不过我测试没有效果这个问题的解决要感谢下面这个博主我是看了这个帖子解决的问题。https://blog.csdn.net/weixin_40280629/article/details/1135633514.3 安全提示参考2.3解决办法4.4 证书commonName这个字段是比较重要的不要随便配置。服务端、客户端证书认证都会验证host name是否与其一致不一致会造成认证失败。这也是为什么要修改hosts并用server.com来访问睡觉睡觉。。。