1. key的生成 (生成服务器私钥)
openssl genrsa -des3 -out ssl.key 2048
openssl rsa -in ssl.key -out ssl.key # 无密码key 一般go不支持带密码的ssl.key
-genrsa:指定了生成了算法使用RSA
-desc:表示生成的key是有密码保护的(注:如果是将生成的key与ssl的证书一起使用,最好不需要密码,就是不要这个参数,否则其它人就会在请求的时候每次都要求输入密码)
-out:后面的参数表示生成的key的输入文件
2048:表示的是生成key的大小,单为字节(bits),看证书提供商要求,比如Godaddy规定是2048
-in : 指定要加密的文件存放路径
2. 生成CA的crt
openssl req -new -x509 -key ssl.key -out ca.crt -days 3650
req: 配置参数-x509指定使用 X.509证书签名请求管理(certificate signing request (CSR)).“X.509” 是一个公钥代表that SSL and TLS adheres to for its key and certificate management.
-rep: 指定要加密的文件存放路径
-new: 表示生成一个新证书部署请求
-x509: 专用于CA生成自签证书,如果不是自签证书则不需要此项
-key: 生成请求时用到的私钥文件
-day: 证书的有效期,单位是天,默认是365天
3.使用ssl.key去 生成csr
openssl req -new -key ssl.key -out ssl.csr
需要依次输入国家,地区,组织,邮箱。最重要的点有两个,一个是域名,一定要是你的域名后缀,并且能接受邮件。另一个是common name,它代表你的证书要代表的目标,如果为你网站申请的证书,就要填写域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
openssl x509 -req -days 3650 -in ssl.csr -CA ca.crt -CAkey ssl.key -CAcreateserial -out ssl.crt
输入key的密钥后,完成证书生成。
-day: 证书的有效期,单位是天,默认是365天
-CA选项指明用于被签名的csr证书,
-CAkey选项指明用于签名的密钥,
-CAserial指明序列号文件,
-CAcreateserial指明文件不存在时自动生成。
5.证书合并:
cat ssl.key ssl.crt > ssl.pem #注意这里文件权限都要修改一下(root用户可忽略)
go 无法支持带密码密钥解决方法:
import(
"github.com/gin-gonic/gin"
"github.com/unrolled/secure"
)
func main(){
router := gin.Default();
router.Use(TlsHandler());
_ = r.RunTLS(":3000", "./ssl.pem", "./ssl.key")
}
func TlsHandler() gin.HandlerFunc {
return func(c *gin.Context) {
secureMiddleware := secure.New(secure.Options{
SSLRedirect: true,
SSLHost: "localhost:8080",
})
err := secureMiddleware.Process(c.Writer, c.Request)
// If there was an error, do not continue.
if err != nil {
return
}
c.Next()
}
}