Golang代码实现HTTPs(HTTPS证书生成和部署)
在win7下试试:
1.实现一个最简单的HTTPS Web Server
// gohttps/2-https/server.go
package main import (
"fmt"
"net/http"
) func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w,
"Hi, This is an example of https service in golang!")
} func main() {
http.HandleFunc("/", handler)
http.ListenAndServeTLS(":8081", "server.crt",
"server.key", nil)
}
上述代码无法正常运行,因为没有server.crt和server.key
2、安装openssl
2.1可到http://slproweb.com/products/Win32OpenSSL.html下载Win64 OpenSSL v1.1.0j。好像该地址应该可以下载Visual C++ 2008Redistributables (x64)的 但是我没找到。直接安装下载的 Win64 OpenSSL v1.1.0j
注:我是直接下载安装了,略过了下面的2.2和2.3
2.2下载Openssl源码,去官网http://www.openssl.org/下载openssl-1.1.0j.tar.gz即可。
解压openssl-1.0.1j.tar.gz,找到\openssl-1.0.1j\apps目录,拷贝demoCA目录和openssl.cnf文件到Openssl的安装目录下的bin目录下(即D:\OpenSSL-Win64\bin\)。
2.3、在D:\OpenSSL-Win64\bin目录下,创建ca、jks、server、client四个目录。
3、生成 server.key和server.crt
3.1 生成 server.key
openssl genrsa -out server.key
注:因为懒得加环境变量,我是在D:\OpenSSL-Win64\bin目录下执行的openssl
3.2生成 server.crt
openssl req -new -x509 -key server.key -out server.crt -days
按照给出的提示依次输入: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.将生成的server.crt和server.key剪切复制到第一步的go程序所在目录,运行go程序
5.打开chrome浏览器访问 localhost:8081
什么?竟然提示该网页无法正常运作!
哦,低级错误,应该访问:https://localhost:8081
又提示“您的连接不是私密连接”,忽略,终于显示Hi, This is an example of https service in golang!
也算是基本打通了https。
然而,浏览器地址栏上大大的红色“不安全”字样看着不舒服。怎么办?
办法1:花钱申请证书或免费证书
办法2:自签证书,在客户端,将证书导入到“受信任的根证书颁发机构”存储区中
另外,还可以双向验证。
补充:
6.符合Chrome58+的证书制作(费了不少劲)
首先设置windows环境变量,我的是 D:\OpenSSL-Win64\bin
主要参考了https://blog.csdn.net/wdydxf/article/details/54576063,可能是openssl版本不同,稍做修改。如不明白,请看原文
下面的操作, 我将建立一个 MyRootCA 的根证书颁发机构, 然后为一个域名是 myserver.com 签发证书
6.1将 C:\OpenSSL-Win64\bin\openssl.cfg 复制到 F:\SSLTest\, 并在F:\SSLTest\执行以下命令
mkdir demoCA\private demoCA\newcerts
type nul > demoCA\index.txt
echo > demoCA\serial
6.2生成CA自签名证书
openssl req -new -x509 -newkey rsa: -days -keyout demoCA\private\MyRootCA.key -out demoCA\MyRootCA.crt -passout pass: -config openssl.cnf
依次输入 CN bj0 bj1 bj2 MyRootCA 空(回车)
6.3生成用户的 RSA 密钥对
openssl genrsa -des3 -out myserver.com._has_passwd.key -passout pass:
6.4 删除私钥中的密码(否则golang程序无法启动)
openssl rsa -in myserver.com._has_passwd.key -out myserver.com.key
6.5生成用户证书请求
openssl req -new -days -key myserver.com.key -out myserver.com.csr -config openssl.cnf
依次输入 123456 CN bj0 bj1 bj2 bjbj myserver.com 空(回车) 空(回车) 空(回车)(注意与6.2的相关输入内容保持一样)
6.6使用 CA 签发用户证书
openssl ca -in myserver.com.csr -out myserver.com.crt -cert demoCA\MyRootCA.crt -keyfile demoCA\private\MyRootCA.key -extensions v3_req -config openssl.cnf
依次输入 123456 y y
6.7验证
在C:\Windows\System32\drivers\etc\hosts中新增一行
127.0.0.1 myserver.com
然后将 MyRootCA.crt 安装到 受信任的根证书颁发机构
将myserver.com.crt和myserver.com.key放到golang源代码目录下
访问:https://myserver.com:8081/
终于显示连接是安全的了。
补充:有的源码不是用.crt 和.key格式的证书和私钥,而都是用.pem后缀的。有的说法是.crt后缀可直接改为.pem,而.key可以转换格式,
如:openssl rsa -in id_rsa -text > private.pem 。
但我没有测试。
重点来了
自签名不推荐,自己是自己拥有域名的话,直接去腾讯云签一个时长一年的专业CA机构签发的dv类型证书就完事了
https://cloud.tencent.com/product/ssl
还有这里https://wzfou.com/letsencrypt/和https://www.cnblogs.com/tv151579/p/8268356.html介绍的:letsencrypt免费SSL证书
最后,听说go https 在速度上不如Nginx + go http 方式
参考:https://segmentfault.com/a/1190000013287122
https://segmentfault.com/a/1190000009666888
https://segmentfault.com/a/1190000016249967
https://blog.csdn.net/zhaotengfei36520/article/details/41962077
https://studygolang.com/articles/9267
https://studygolang.com/articles/9959
https://blog.51cto.com/colinzhouyj/1566438
https://blog.csdn.net/luyangbin01/article/details/50972693
https://blog.csdn.net/sunhuansheng/article/details/82902185
https://blog.csdn.net/mixika99/article/details/79009521
https://blog.csdn.net/huplion/article/details/52892869
https://www.cnblogs.com/274914765qq/p/4672108.html
https://blog.csdn.net/c_base_jin/article/details/81229643
http://www.mamicode.com/info-detail-1938899.html
https://blog.csdn.net/wdydxf/article/details/54576063
https://blog.csdn.net/qq_37049781/article/details/84837342
Golang代码实现HTTPs(HTTPS证书生成和部署)的更多相关文章
- mkcert本地 HTTPS 加密证书生成工具
软件介绍: mkcert 是一个生成本地 HTTPS 加密证书的工具,一个命令就可以生成证书,不需要任何配置. 下载地址: https://github.com/FiloSottile/mkcert/ ...
- apache https 双向证书生成
Https分单向认证和双向认证 单向认证表现形式:网站URL链接为https://xxx.com格式 双向认证表现心事:网站URL链接为https://xxx.com格式,并且需要客户端浏览器安装一个 ...
- Https:证书生成 .p12 .keyStore 和 .truststore文件理解
当我们需要SSL证书时,可以自动生成SSL证书,但是每个系统都申请一次证书会比较麻烦,所以用到了如下几个文件格式: .p12(PKCS #12) 我们的每一个证书都可以生成一个.p12文件,这个文 ...
- [svc]HTTPS证书生成原理和部署细节
参考: http://www.barretlee.com/blog/2015/10/05/how-to-build-a-https-server/ 今天摸索了下 HTTPS 的证书生成,以及它在 Ng ...
- Windows下Nginx配置SSL实现Https访问(包含证书生成)
Vincent.李 Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...
- HTTPS证书生成原理和部署细节
看看下面,部分电信用户访问京东首页的时候,会看到右下角有一个浮动广告: 小白用户以为是京东有意放置的,细心的用户会发现,这个 iframe 一层嵌一层的恶心广告很明显是电信/中间人通过 DNS 劫持注 ...
- TLS/HTTPS 证书生成与验证
最近在研究基于ssl的传输加密,涉及到了key和证书相关的话题,走了不少弯路,现在总结一下做个备忘 科普:TLS.SSL.HTTPS以及证书 不少人可能听过其中的超过3个名词,但它们究竟有什么关联呢? ...
- Tomcat配置https之 JDK SSL证书生成与验证
关于证书 SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure socket layer(SSL),安全协议是由Netscape Communication公司设计开发. ...
- 微信支付HTTPS服务器证书验证指引
1. 背景介绍 2. 常见问题 3. 验证证书 4. 安装证书 背景介绍 微信支付使用HTTPS来保证通信安全, 在HTTPS服务器上部署了由权威机构签发的证书, 用于证明微信支付平台的真实身份. 商 ...
随机推荐
- HNOI2019 苟命记
Day0 瞎看了看博客,然后看了看wf题,看了一下午柯南剧场版... 后来发现,复习根本没用,因为我根本没学过. Day1 首先随便看了看三道题,觉得 \(T1\) 挺可做的,\(T2\) 看起来是什 ...
- .NET Core 给使用.NET的公司所带来的机遇
今晚在余晟的微信公众号看到了一篇文章< 从.NET/C#开发的“后继无人”说起: https://mp.weixin.qq.com/s/rO2d0xZ58Z2syqT7AaNT3w>. 这 ...
- Markdown 插入图片技巧
在使用Markdown编写博客或文件的时候,经常会需要插入图片.如果使用Markdown语法,我们会发现调整图片的大小会是个问题. 所以推荐使用另一种办法插入图片,使用HTML语法,示例如下: < ...
- [Swift-2019力扣杯春季决赛]1. 有序数组中的缺失元素
给出一个有序数组 A,数组中的每个数字都是 独一无二的,找出从数组最左边开始的第 K 个缺失数字. 示例 1: 输入:A = [4,7,9,10], K = 1 输出:5 解释: 第一个缺失数字为 5 ...
- 《前端之路》之四 JavaScript 的闭包、作用域、作用域链
04:JavaScript 的闭包 一.定义: 常规定义: 闭包的定义: 有权利访问外部函数作用域的函数. 通俗定义: 1.函数内部包含了函数.然后内部函数可以访问外部函数的作用域. 2.内部函数可以 ...
- ViewPagerWithImageDemo【ViewPager如何判断滑动到第一页和最后一页以及弹出对话框功能】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录viewpager滑动的时候弹出对话框的功能(关键功能是滑动弹出对话框后,隐藏对话框的时候当前页可以还原到原位置),顺便判断首页 ...
- SQL之case when then用法(用于分类统计)
case具有两种格式.简单case函数和case搜索函数. --简单case函数 case sex when '1' then '男' when '2' then '女’ else '其他' end ...
- kubernetes系列11—PV和PVC详解
本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 管理存储是管理计算的一个明显问题.该PersistentVolume子系统为用户和管理员提供了一个A ...
- keil进阶教程
前言 keil只懂得创建软件工程是远远不够的,如果要想顺心使用,应该要懂得部分配置,这样使用心情顺畅,码代码也会越发高效. 设置字号字体 编辑点击编辑菜单,会出现很多子目录,找到配置,点击进入设置页面 ...
- 【带着canvas去流浪(7)】绘制水球图
目录 一. 任务说明 二. 重点提示 三. 示例代码 四. 文字淹水效果的实现 五. 关于canvas抗锯齿 六. 小结 示例代码托管在:http://www.github.com/dashnowor ...