golang https的单向认证,双向认证

1、服务端私钥与证书

server 代码

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "net/http"
 6 )
 7 
 8 func main() {
 9 
10     http.HandleFunc("/test", handler)
11     // http.ListenAndServe(":9898", nil)
13     http.ListenAndServeTLS(":9898", "cert/ca.crt", "cert/ca.key", nil)
14 }
15 
16 func handler(w http.ResponseWriter, r *http.Request) {
17     fmt.Fprintf(w,"测试!")
18 }

client 代码

 1 package main
 2 
 3 import (
 4     "crypto/tls"
 5     "io/ioutil"
 6     "log"
 7     "net/http"
 8 )
 9 
10 func main() {
11     var (
12         resp   *http.Response
13         err    error
14         body   []byte
15         tr     *http.Transport
16         client *http.Client
17     )
18    // 配置tls参数
19     tr = &http.Transport{
20         TLSClientConfig: &tls.Config{
21             InsecureSkipVerify: true,
22         },
23     }
24 
25     client = &http.Client{Transport: tr}
26    // 请求接口
27     resp, err = client.Get("https://127.0.0.1:9898/test")
28 
29     if err != nil {
30         log.Fatalln("接口请求失败", err)
31     }
32     
33     defer resp.Body.Close()
34    // 读取body数据
35     body, err = ioutil.ReadAll(resp.Body)
36 
37     log.Println("请求结果", string(body))
39 }

2、对服务端的证书进行校验

server 代码

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "net/http"
 6 )
 7 
 8 func main() {
 9 
10     http.HandleFunc("/test", handler)
11     // http.ListenAndServe(":9898", nil)
12 
13     http.ListenAndServeTLS(":9898", "cert/server.crt", "cert/server.key", nil)
14 }
15 
16 func handler(w http.ResponseWriter, r *http.Request) {
17     fmt.Fprintf(w,"测试")
18 }

client 代码

 1 package main
 2 
 3 import (
 4     "crypto/tls"
 5     "crypto/x509"
 6     "io/ioutil"
 7     "log"
 8     "net/http"
 9 )
10 
11 func main() {
12     var (
13         resp   *http.Response
14         err    error
15         body   []byte
16         tr     *http.Transport
17         client *http.Client
18         pool   *x509.CertPool
19         crt    []byte
20     )
21     pool = x509.NewCertPool()
22     // 读取证书
23     crt, err = ioutil.ReadFile("cert/ca.crt")
24     if err != nil {
25         log.Fatalln("读取证书错误", err)
26     }
27     pool.AppendCertsFromPEM(crt)
28 
29     tr = &http.Transport{
30         TLSClientConfig: &tls.Config{
31             // InsecureSkipVerify: true,
32             RootCAs: pool,
33         },
34         DisableCompression: true,
35     }
36 
37     client = &http.Client{Transport: tr}
38   
39    // resp, err = client.Get("https://127.0.0.1:9898/test") 
40     resp,err=client.Get("https//server:9898/test")
41     if err != nil {
42         log.Fatalln("接口请求失败", err)
43     }
44 
45     defer resp.Body.Close()
46 
47     body, err = ioutil.ReadAll(resp.Body)
48 
49     log.Println("请求结果", string(body))
50 
51 }

3、server/client的双向校验

server代码

package main
 
// 双向认证
import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)
 
type ServerHandler struct{}
 
func (s *ServerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w,"测试")
}
 
func main() {
    pool := x509.NewCertPool()
    caPath := "cert/ca.crt"
    crt, err := ioutil.ReadFile(caPath)
    if err != nil {
        log.Fatalln("读取证书错误", err)
    }
    pool.AppendCertsFromPEM(crt)
 
    s := &http.Server{
        Addr:    ":9898",
        Handler: &ServerHandler{},
        TLSConfig: &tls.Config{
            ClientCAs:  pool,
            ClientAuth: tls.RequireAndVerifyClientCert,
        },
    }
    s.ListenAndServeTLS("cert/server.crt", "cert/server.key")
}

client 代码

package main
 
import (
    "crypto/tls"
    "crypto/x509"
    "io/ioutil"
    "log"
    "net/http"
)
 
func main() {
    var (
        resp   *http.Response
        err    error
        body   []byte
        tr     *http.Transport
        client *http.Client
        pool   *x509.CertPool
        crt    []byte
        cliCrt tls.Certificate
    )
    pool = x509.NewCertPool()
    // 读取证书
    crt, err = ioutil.ReadFile("cert/ca.crt")
    if err != nil {
        log.Fatalln("读取证书错误", err)
    }
    pool.AppendCertsFromPEM(crt)
    // 加载X509 client证书和秘钥
    cliCrt,err=tls.LoadX509KeyPair("cert/client.crt","cert/client.key")
    if err!=nil{
        panic(err)
    }
 
    tr = &http.Transport{
        TLSClientConfig: &tls.Config{
            // InsecureSkipVerify: true,
            RootCAs: pool,
            Certificates:[]tls.Certificate{cliCrt},
        },
        // DisableCompression: true,
    }
 
    client = &http.Client{Transport: tr}
 
    resp, err = client.Get("https://127.0.0.1:9898/test")
 
    if err != nil {
        log.Fatalln("接口请求失败", err)
    }
 
    defer resp.Body.Close()
 
    body, err = ioutil.ReadAll(resp.Body)
 
    log.Println("请求结果", string(body))
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gRPC是一种高性能、开源的远程过程调用(RPC)框架,它使用Protocol Buffers作为接口定义语言(IDL)。双向认证是指在进行gRPC通信时,服务端和客户端都需要进行身份验证。在gRPC中,双向认证可以通过使用TLS/SSL证书来实现。 在gRPC中实现双向认证需要以下步骤: 1. 生成证书:首先,需要生成服务端和客户端的证书。可以使用openssl或其他工具来生成证书和私钥。 2. 配置TLS/SSL:服务端和客户端都需要配置TLS/SSL来启用加密通信。服务端需要加载证书和私钥,而客户端需要加载服务端的证书用于验证服务端身份。 3. 配置双向认证:服务端和客户端都需要配置双向认证。服务端需要验证客户端的证书,而客户端需要验证服务端的证书。 4. 实现认证逻辑:在服务端和客户端的代码中,需要实现证书验证逻辑。可以使用TLS配置中的回调函数来进行验证。 可以参考引用\[2\]中提供的gRPC-Gateway和引用\[3\]中的依赖安装命令来实现gRPC双向认证。这些工具和库可以帮助简化双向认证的实现过程。 总结起来,golang中实现gRPC双向认证的步骤包括生成证书、配置TLS/SSL、配置双向认证和实现认证逻辑。通过这些步骤,可以确保服务端和客户端之间的通信是安全和可信的。 #### 引用[.reference_title] - *1* [Go Grpc Jwt身份认证和Gateway集成以及HTTPS双向认证](https://blog.csdn.net/dz45693/article/details/112180692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【gRPC】双向认证下grpc-gateway原理及简单使用](https://blog.csdn.net/dl962454/article/details/124384299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值