首页 » PHP教程 » phpcurl双向认证技巧_golang 实现https双向认证

phpcurl双向认证技巧_golang 实现https双向认证

访客 2024-11-02 0

扫一扫用手机浏览

文章目录 [+]

一、什么是https?

日常开拓中大家可能打仗最多的都是http协议, 说到http协议也不得不提到TCP/IP协议以及打算机网络中tcp/ip五层与OCI7层架构模型有关, http(超文本传输协议)用户客户端和做事端之间的通信, 位于tcp/ip五层协议中最上层传输层, http传输过程中都是明文传输, 易引起安全问题, 所有出身了https协议。

phpcurl双向认证技巧_golang 实现https双向认证 phpcurl双向认证技巧_golang 实现https双向认证 PHP教程

HTTPS协议 = HTTP协议 + SSL/TLS协议, 在HTTPS数据传输的过程中, 须要用SSL/TLS对数据进行加密和解密, 须要用HTTP对加密后的数据进行传输, 由此可以看出HTTPS是由HTTP和SSL/TLS一起互助完成的。

phpcurl双向认证技巧_golang 实现https双向认证 phpcurl双向认证技巧_golang 实现https双向认证 PHP教程
(图片来自网络侵删)

SSL的全称是Secure Sockets Layer, 即安全套接层协议, 是为网络通信供应安全及数据完全性的一种安全协议。
SSL协议在1994年被Netscape发明, 后来各个浏览器均支持SSL, 其最新的版本是3.0

二、加密算法

2.1 TLS/SSL的功能紧张依赖三类算法实现:散列函数 Hash、对称加密和非对称加密, 其利用非对称加密实现身份认证和密钥协商, 对称加密算法采取协商的密钥对数据加密, 基于散列函数验证信息的完全性(对付三种加密算法含义这里就不一一概述), 而在TLS/SSL加密算法中还会涉及一下几个关键观点:

密钥:改变密码行为的数字化参数。

对称密钥加密系统:编 / 解码利用相同密钥的算法。

不对称密钥加密系统:编 / 解码利用不同密钥的算法。

公开密钥加密系统:一种能够使数百万打算机便捷地发送机密报文的系统。

数字署名:用来验证报文未被假造或修改的校验和。

数字证书:由一个可信的组织验证和签发的识别信息。

2.2 TLS的基本事情办法是,客户端利用非对称加密与做事器进行通信,实现身份验证并协商对称加密利用的密钥, 然后对称加密算法采取协商密钥对信息以及信息择要进行加密通信,不同的节点之间采取的对称密钥不同,从而可以担保信息只能通信双方获取。

2.3 https通信过程中数字证书概览:

ca.pem 根证书, 由根证书颁发客户端和做事端证书

client.pem 客户端证书

client-key.pem 客户端秘钥

server.pem 做事端证书

server-key.pem 做事端秘钥

三、如何自署名证书?

3.1 目前自觉表证书工具有两类, 一是利用openssl 插件天生证书, 二是通过cfssl插件天生证书, 本例采取cfssl 工具天生证书

3.2 cfssl是一款由golang编写的证诗人成工具, 官网地址:https://github.com/cloudflare/cfssl

安装步骤:

@tips: 该方法须要安装golang环境,如果没有golang请参照二进制包安装办法

> # go get -u github.com/cloudflare/cfssl/cmd/cfssl> # go get -u github.com/cloudflare/cfssl/cmd/cfssljson

@tips windows环境须要将gopath下bin目录添加path环境中方可实行cfssl命令

查看安装是否成功:

> # cfssl

3.3 创建CA证书

> # mkdir ssl & cd ssl> # cfssl print-defaults config > ca-config.json> # cfssl print-defaults csr > ca-csr.json

然后修正ca-config.json文件

> # vim ca-config.json{"signing": {"default": {"expiry": "43800h"},"profiles": {"server": {"expiry": "43800h","usages": ["signing","key encipherment","server auth"]},"client": {"expiry": "43800h","usages": ["signing","key encipherment","client auth"]},"peer": {"expiry": "43800h","usages": ["signing","key encipherment","server auth","client auth"]}}}}

修正 expiry 值为 43800h

## 天生ca 证书> # mkdir ca> # cfssl gencert -initca ca-csr.json | cfssljson -bare ca/ca -

3.4 创建serverd端证书

> # mkdir server> # cfssl print-defaults csr > server.json

## 修正server.json{"CN": "Server","hosts": ["localhost","127.0.0.1"],"key": {"algo": "ecdsa","size": 256},"names": [{"C": "CN","L": "SH","ST": "SH"}]}

## 签发server端证书> # cfssl gencert -ca=ca/ca.pem -ca-key=ca/ca-key.pem -config=ca-config.json -profile=server server.json | cfssljson -bare server/server

把稳: 个中 -profile=server 来自于配置文件 ca-config.json profiles 属性值

3.5 创建客户端证书:

> # mkdir client> # cfssl print-defaults csr > client.json## 修正client.json{"CN": "Client","hosts": [],"key": {"algo": "ecdsa","size": 256},"names": [{"C": "CN","L": "SH","ST": "SH"}]}

## 天生客户端证书和私钥> # cfssl gencert -ca=ca/ca.pem -ca-key=ca/ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client/client

把稳: 个中 -profile=client 来自于配置文件 ca-config.json profiles 属性值

3.6 考验天生的证书是否和配置相符合:

> # cd> # openssl x509 -in ca.pem -text -noout> # cd ..> # cd server> # openssl x509 -in server.pem -text -noout> # cd ..> # cd client> # openssl x509 -in client.pem -text -noout

四 golang实现https双向认证

实例1: https双向认证

server端代码实现:

server.go

package mainimport ( "crypto/tls" "crypto/x509" "fmt" "io/ioutil" "log" "net/http")type Cert struct { K8sAgentCrtPath string K8sAgentServerCertPath string K8sAgentKeyPath string}func handler(w http.ResponseWriter, r http.Request) { fmt.Fprintf(w, "Hi, This is an example of https service in golang!")}func main() { cert := Cert{ K8sAgentCrtPath: "ca/ca.pem", K8sAgentServerCertPath: "server/server.pem", K8sAgentKeyPath: "server/server-key.pem", } // ssl 双向考验 pool := x509.NewCertPool() // 根证书 crt, err := ioutil.ReadFile(cert.K8sAgentCrtPath) if err != nil { log.Fatalln("读取证书失落败!
", err.Error()) } pool.AppendCertsFromPEM(crt) http.HandleFunc("/", handler) s := &http.Server{ Addr: ":8080", TLSConfig: &tls.Config{ ClientCAs: pool, ClientAuth: tls.RequireAndVerifyClientCert, // 考验客户端证书 }, } log.Fatal(s.ListenAndServeTLS(cert.K8sAgentServerCertPath, cert.K8sAgentKeyPath)) // 做事端证书和做事端秘钥}

client.go

package mainimport ( "crypto/tls" "crypto/x509" "fmt" "io/ioutil" "log" "net/http")type Cert struct { K8sAgentCrtPath string ClientCrt string ClientKey string}func main() { cert := Cert{ K8sAgentCrtPath: "ca/ca.pem", ClientCrt: "client/client.pem", ClientKey: "client/client-key.pem", } pool := x509.NewCertPool() caCrt, err := ioutil.ReadFile(cert.K8sAgentCrtPath) // 根证书 if err != nil { log.Fatal("read ca.crt file error:", err.Error()) } pool.AppendCertsFromPEM(caCrt) cliCrt, err := tls.LoadX509KeyPair(cert.ClientCrt, cert.ClientKey) // 客户端证书 和 客户端秘钥 if err != nil { log.Fatalln("LoadX509KeyPair error:", err.Error()) } tr := &http.Transport{ TLSClientConfig: &tls.Config{ RootCAs: pool, Certificates: []tls.Certificate{cliCrt}, }, } client := &http.Client{Transport: tr} resp, err := client.Get("https://127.0.0.1:8080/") if err != nil { panic(err.Error()) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) fmt.Println(string(body))}

> # go run server.go> # go run client.goHi, This is an example of https service in golang!

实例2: 搭建https做事

> # http.go

package mainimport ("fmt""net/http")func handler(w http.ResponseWriter, r http.Request) { fmt.Fprintf(w, "这是一个https要求")}func main() {http.HandleFunc("/", handler) // err := http.ListenAndServeTLS(":8081", "server.crt", "server.key", nil) // 证书的文件名称可能有出入 err := http.ListenAndServeTLS(":8081", "server/server.pem", "server/server-key.pem", nil) if err != nil { fmt.Println(err)}}

> # curl -k https://112.74.106.92:8081/这是一个https要求

把稳: -k 忽略证书警告

项目目录构造

> # cd /data/ssl> # tree.├── ca│ ├── ca.csr│ ├── ca-key.pem│ └── ca.pem├── ca-config.json├── ca-csr.json├── client│ ├── client.csr│ ├── client-key.pem│ └── client.pem├── client.go├── client.json├── go.mod├── http.go├── server│ ├── server.csr│ ├── server-key.pem│ └── server.pem├── server.go└── server.json3 directories, 17 files

五 利用openssl天生server.crt和server.key文件供程序利用

天生秘钥文件

> # openssl genrsa -out server.key 2048

天生证书文件

> # openssl req -new -x509 -key server.key -out server.crt -days 365......Common Name (eg, your name or your server's hostname) []:localhost......

提示: 指定hostname的名称, 其他随便写或留空

实例3: 搭建https做事

http.go

package mainimport ( "fmt" "net/http")func handler(w http.ResponseWriter, r http.Request) { fmt.Fprintf(w, "这是一个https要求")}func main() { http.HandleFunc("/", handler) // 证书的文件名称可能有出入 err := http.ListenAndServeTLS(":8081", "server.crt", "server.key", nil) // err := http.ListenAndServeTLS(":8081", "server/server.pem", "server/server-key.pem", nil) if err != nil { fmt.Println(err) }}

> # curl -k https://112.74.106.92:8081/

这是一个https要求

标签:

相关文章

二维码,新时代信息传递的魔法钥匙

随着科技的飞速发展,我们正进入一个信息爆炸的时代。在这个时代,信息的传递方式也在不断地演变。而二维码,作为一种新兴的信息传递技术,...

PHP教程 2024-12-05 阅读0 评论0