2023年12月7日发(作者:)

Golang代码实现HTTPs(HTTPS证书生成和部署)

在win7下试试:

1.实现一个最简单的HTTPS Web Server

// gohttps/2-https/

package main

import (

"fmt"

"net/http"

)

func handler(w seWriter, r *t) {

f(w,

"Hi, This is an example of https service in golang!")

}

func main() {

Func("/", handler)

AndServeTLS(":8081", "",

"", nil)

}

上述代码无法正常运行,因为没有和

2、安装openssl

注:我是直接下载安装了,略过了下面的2.2和2.3

解压,找到openssl-1.0.1japps目录,拷贝demoCA目录和文件到Openssl的安装目录下的bin目录下(即

D:OpenSSL-Win64bin)。

2.3、在D:OpenSSL-Win64bin目录下,创建ca、jks、server、client四个目录。

3、生成 和

3.1 生成

openssl genrsa -out 2048

注:因为懒得加环境变量,我是在D:OpenSSL-Win64bin目录下执行的openssl

3.2生成

openssl req -new -x509 -key -out -days 3650

按照给出的提示依次输入:CN BJ 等,如下:

-----

Country Name (2 letter code) [AU]:CN

State or Province Name (full name) [Some-State]:BJ

Locality Name (eg, city) []:BJ

Organization Name (eg, company) [Internet Widgits PtyLtd]:ple

Organizational Unit Name (eg, section) []:live

Common Name (eg, YOUR name) []:root

Email Address []:

---------------------

4.将生成的和剪切复制到第一步的go程序所在目录,运行go程序

5.打开chrome浏览器访问 localhost:8081

什么?竟然提示该网页无法正常运作!

又提示“您的连接不是私密连接”,忽略,终于显示Hi, This is an example of https service in golang!

也算是基本打通了https。然而,浏览器地址栏上大大的红色“不安全”字样看着不舒服。怎么办?

办法1:花钱申请证书或免费证书

办法2:自签证书,在客户端,将证书导入到“受信任的根证书颁发机构”存储区中

另外,还可以双向验证。

补充:

6.符合Chrome58+的证书制作(费了不少劲)

6.1将 C: 复制到 F:SSLTest, 并在F:SSLTest执行以下命令

mkdir demoCAprivate demoCAnewcerts

type nul >

echo 01 > demoCAserial

6.2生成CA自签名证书

openssl req -new -x509 -newkey rsa:2048 -days 3650 -keyout -out -passout pass:123456 -config

依次输入 CN bj0 bj1 bj2 MyRootCA 空(回车)

6.3生成用户的 RSA 密钥对

openssl genrsa -des3 -out ._has_ -passout pass:123456

6.4 删除私钥中的密码(否则golang程序无法启动)

openssl rsa -in ._has_ -out

6.5生成用户证书请求

openssl req -new -days 1825 -key -out -config

依次输入 123456 CN bj0 bj1 bj2 bjbj 空(回车) 空(回车) 空(回车)(注意与6.2的相关输入内容保持一样)

6.6使用 CA 签发用户证书

openssl ca -in -out -cert -keyfile -extensions v3_req -config

依次输入 123456 y y

6.7验证

在C:WindowsSystem32driversetchosts中新增一行

127.0.0.1

然后将 安装到 受信任的根证书颁发机构

将和放到golang源代码目录下

补充:有的源码不是用.crt 和.key格式的证书和私钥,而都是用.pem后缀的。有的说法是.crt后缀可直接改为.pem,而.key可以转换格式,

如:openssl rsa -in id_rsa -text > 。

但我没有测试。

重点来了

 自签名不推荐,自己是自己拥有域名的话,直接去腾讯云签一个时长一年的专业CA机构签发的dv类型证

书就完事了

最后,听说go https 在速度上不如Nginx + go http 方式