Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang实现http2.0服务端,客户端完整案例

golang实现http2.0服务端,客户端完整案例

作者头像
公众号-利志分享
发布于 2022-04-25 01:41:05
发布于 2022-04-25 01:41:05
5.3K00
代码可运行
举报
文章被收录于专栏:利志分享利志分享
运行总次数:0
代码可运行

为了学习golang的client源码执行流程,所以笔者通过golang实现http2的服务端和客户端,然后通过单步调试学习源码。下面我们看下整个golang实现http2的服务步骤。

1 生成公钥私钥文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
openssl req -newkey rsa:2048 -nodes -keyout private.pem -x509 -days 365 -out certificate.pem

private.pem:服务端私钥

certificate.pem:证书文件

2 实现server端代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "golang.org/x/net/http2"
    "golang.org/x/net/http2/h2c"
    "log"
    "net/http"
    "os"
)

func main() {
    path, _ := os.Getwd()
    handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Hello world")
        fmt.Fprintf(w, "Protocol: %s\n", r.Proto)
    })
    h2s := &http2.Server{
        // ...
    }
    h1s := &http.Server{
        Addr:    ":8080",
        Handler: h2c.NewHandler(handler, h2s),
    }
    log.Fatal(h1s.ListenAndServeTLS(path+"\\certificate.pem", path+"\\private.pem"))
}

3 实现客户端代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "golang.org/x/net/http2"
    "io/ioutil"
    "log"
    "net/http"
    "os"
    "time"
)

var url = "https://localhost:8080"

func main() {
    request2()
}

func request2() {
    path, _ := os.Getwd()
    client := &http.Client{
        Timeout: 100 * time.Millisecond,
    }
    //读取证书文件,正式环境无读取证书文件,因为本地测试是无法认证证书
    caCert, err := ioutil.ReadFile(path + "\\http_connect\\certificate.pem")
    if err != nil {
        log.Fatalf("Reading server certificate: %s", err)
        return
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)
    //tls协议配置,InsecureSkipVerify认证证书是否跳过
    tlsConfig := &tls.Config{
        RootCAs: caCertPool,
        //设置安全跳跃认证
        InsecureSkipVerify: true,
    }
    client.Transport = &http2.Transport{
        TLSClientConfig: tlsConfig,
    }
    resp, err := client.Get(url)
    if err != nil {
        fmt.Printf("Failed get: err:%s \n", err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Printf("Failed reading response body: %s\n", err)
        return
    }
    fmt.Printf("Get request2 response %d: %s %s\n", resp.StatusCode, resp.Proto, string(body))
}

//http1请求
func request1() {
    //http1
    _, err := http.Get(url)
    fmt.Println(err)
}

//http11请求
func request11() {
    path, _ := os.Getwd()
    client := &http.Client{}
    //证书文件
    caCert, err := ioutil.ReadFile(path + "\\certificate.pem")
    if err != nil {
        log.Fatalf("Reading server certificate: %s", err)
        return
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)
    // Create TLS configuration with the certificate of the server
    tlsConfig := &tls.Config{
        RootCAs: caCertPool,
        //设置安全跳跃认证
        InsecureSkipVerify: true,
    }
    client.Transport = &http.Transport{
        TLSClientConfig: tlsConfig,
    }
    resp, err := client.Get(url)
    if err != nil {
        log.Fatalf("Failed get: %s", err)
        return
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatalf("Failed reading response body: %s", err)
        return
    }
    fmt.Printf("Got response %d: %s %s\n", resp.StatusCode, resp.Proto, string(body))
}

问题总结:

报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 x509: certificate is not valid for any names, but wanted to match localhost

是http2请求安全认证不过,通过设置如下参数来实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//设置安全跳跃认证
InsecureSkipVerify: true,
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go https 笔记
理解为运行在SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议所构建的安全层之上的HTTP协议
solate
2019/07/22
9140
【实践】如何在本地环境用GO实现HTTPS链接?
本篇文章是基于实操,如何在本地环境用GO实现HTTPS链接。原理部分请参考文章《【深度知识】HTTPS协议原理和流程分析》。
辉哥
2019/05/15
2.7K0
【实践】如何在本地环境用GO实现HTTPS链接?
Go每日一库之126:h2c(明文https)
net/http包默认支持http2的,而HTTP/2强制使用TLS的,所以在使用的时候必须指定证书,正好最近玩过,在这写一下:
luckpunk
2023/09/30
7920
go-https的简单实现
X.509 Certificate Signing Request (CSR) Management.
fnatic
2022/07/22
24.7K0
https原理以及golang基本实现
大致上分为两类,基于key的加密算法与不基于key的加密算法。现在的算法基本都是基于key的,key就以一串随机数数,更换了key之后,算法还可以继续使用。
我的小碗汤
2018/08/22
9710
go: grpc tls 应用一览
在go 1.15以上版本,必须使用SAN方式,否则会报"transport: authentication handshake failed: x509: certificate relies on legacy Common Name field, use SANs instead"
超级大猪
2023/01/31
1.4K0
Go和HTTPS -2
F为签名函数。CA自己的私钥是唯一标识CA签名的,因此CA用于生成数字证书的签名函数一定要以自己的私钥作为一个输入参数。在RSA加密 系统中,发送端的解密函数就是一个以私钥作 为参数的函数,因此常常被用作签名函数使用。签名算法是与证书一并发送给接收 端的,比如apple的一个服务的证书中关于签名算法的描述是“带 RSA 加密的 SHA-256 ( 1.2.840.113549.1.1.11 )”。因此CA用私钥解密函数作为F,对C的摘要进行运算得到了客户数字证书的签名,好比大学毕业证上的校长签名,所有毕业证
李海彬
2018/03/23
1.3K0
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
本篇教程我们将介绍 HTTP 服务端技术,包括如何处理 HTTP 请求和 HTTPS 请求。
学院君
2019/11/12
2.4K0
Go 语言网络编程系列(五)—— HTTP 编程篇:HTTP/HTTPS 请求处理
grpc-go之基本使用(一)
gRPC 是一个高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。
Johns
2022/09/26
1.5K0
Go 每日一库之 rpcx
在之前的两篇文章rpc和json-rpc中,我们介绍了 Go 标准库提供的rpc实现。在实际开发中,rpc库的功能还是有所欠缺。今天我们介绍一个非常优秀的 Go RPC 库——rpcx。rpcx是一位国人大牛开发的,详细开发历程可以在rpcx官方博客了解。rpcx拥有媲美,甚至某种程度上超越gRPC的性能,有完善的中文文档,提供服务发现和治理的插件。
用户7731323
2020/09/08
9680
Go和HTTPS--1
近期在构思一个产品,考虑到安全性的原因,可能需要使用到HTTPS协议以及双向数字证书校验。之前只是粗浅接触过HTTP(使用Golang开 发微信系列)。对HTTPS的了解则始于那次自行搭建ngrok服务,在那个过程中照猫画虎地为服务端生成了一些私钥和证书,虽然结果是好 的:ngrok服务成功搭建起来了,但对HTTPS、数字证书等的基本原理并未求甚解。于是想趁这次的机会,对HTTPS做一些深度挖掘。主要途 径:翻阅网上资料、书籍,并利用golang编写一些实验examples。 一、HTTPS简介 日常生活中
李海彬
2018/03/23
1.1K0
使用 GoLang 获取 TLS 的 Client Hello Info
TLS(Transport Layer Security)是一个保证信息安全的应用层协议。它的前身是 SSL(Secure Socket Layer)。它是一套定义了如何对由 TCP 传输的报文进行加密的协议。
饶文津
2020/07/14
3.5K0
使用 GoLang 获取 TLS 的 Client Hello Info
go 原生代码搞定https双向认证客户端私钥加密
最近有一个https双向认证的项目,客户端的证书是加密的,之前用python requests 做原型测试发现不支持加密,需要运行的时候在终端输入密码。
有福
2019/02/22
3.1K0
go 原生代码搞定https双向认证客户端私钥加密
KubeEdge云边隧道Stream源码解析
Stream是KubeEdge中提供云边隧道的模块,目前支持ApiServer向Kubelet发起的containerLog、exec和metrics请求。云边隧道基于WebSocket建造,支持双向传输和流式传输。
CNCF
2021/05/07
1.5K0
KubeEdge云边隧道Stream源码解析
Go代码打通HTTPs
TL;DR 手工创建CA证书链,手写代码打通HTTPs的两端 HTTPs最近是一个重要的话题,同时也是一个有点难懂的话题。所以网上有大量的HTTPs/TLS/SSL的教程。关于这些的原理,这里不做讲解,有兴趣的可以自行搜索。 本文介绍一个自己创建证书,并编写 Go 代码实现 client/server 两端的过程。从实践的角度帮助理解。 构建 CA 证书链 我们首先要创建 client/server 使用的证书。创建证书的方法有很多种:有不怕麻烦,直接通过 openssl 创建的,有通过 cfssl 创建的
李海彬
2018/03/16
1.5K0
golang源码分析:分布式链路追踪
在上一节搭完分布式追踪的采集展示链路后,这一节开始分析分析分布式链路追踪的核心源码。我们知道分布式追踪的原理是通过traceId串联调用链路上的所有服务和日志,每个服务都有一个自己的spanId,每一次rpc调用都需要生成一个子spanId,通过父子spanID的对应关系,构建一个有向无环图实现分布式追踪的。因此在业务代码的接入过程中需要实现如下功能,父子span关系的构建,父子span关系的传递(包括context内部传递和rpc服务之间的传递有可能跨协议比如http和grpc协议之间传递),rpc日志的采样,上报等等。每一个厂商都有自己的实现,opentrace定义了统一的标准接口,我们按照标准实现即可。在业务代码中实现包括四步:
golangLeetcode
2022/12/17
8680
golang源码分析:分布式链路追踪
客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?
之前我有结论:HTTP keep-alive 是在应用层对TCP连接的滑动续约复用,如果客户端、服务器稳定续约,就成了名副其实的长连接。
有态度的马甲
2022/03/30
1.3K0
客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?
使用golang部署运行tls的https服务时,不用停机,高效证书下放,如何实现?
这篇文章主要介绍如何在应用golang语言开发http/https服务时,如何让tls自动获取证书,而不必在证书更新或重置以后,还要重启服务器来让业务重新起效,本文分成三部分,第一部分会介绍tls加密的常用加密算法进行分析总结,虽然与主干关系不特别大,但是该段络会帮你厘清一个日常使用中,非常容易被混淆的问题;第二部分会重点介绍如何部署一个不需要重启也能tls自动更新的高抽象度的http服务;第三部分会对整个文章进行总结,相信基于该文章的学习,你一定会对tls领域和流量监测、安全防护领域常见的算法有相对深刻的理解,也对如何高度抽象一个自签名的golang服务有全新的认识。那么文章开始!
用户1413827
2023/11/28
1.5K0
使用https双端互相认证实现设备公网接入
在公网环境下,设备接入要保证安全性,server端既要验证设备的身份,设备也要验证server端的身份,这时就需要做双端互相认证。
海阔天空0
2019/02/23
2.1K0
使用https双端互相认证实现设备公网接入
gRPC,爆赞
gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。
AlwaysBeta
2021/10/12
1.3K0
相关推荐
go https 笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验