1. 背景

证书需要向云服务提供商购买,是需要付费,但用在应用开发场景是不合适的,需要开发者自己自签证书进行测试

2. 工具包

  • Cygwin
a large collection of GNU and Open Source tools which provide functionality similar to a
Linux distribution
on Windows a DLL (cygwin1.dll) which provides substantial POSIX API functionality 下载地址: http://www.cygwin.com/ 详细安装教程: https://blog.csdn.net/u010356768/article/details/90756742

3. 生成CA证书

CA -- 根证书,是属于根证书颁发机构(CA)的公钥证书,用以验证他签发的证书(客户端和服务端)

  • 生成CA证书 -- key
# 创建 cert目录,进入该目录,作为证书保存目录
# 在目录下启动命令终端
openssl genrsa -out ca.key 4096
# 会在 cert目录下生成 ca.key文件,该文件作为生成证书-cert文件基础文件
  • 生成CA证书 - crt
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
# -new 生成新的证书
# -days 证书的有效时间
# -key 指定ca证书key文件路径
# -out CA证书保存位置
# CA证书,这里的Common Name 是CA证书的颁发者 -- beimenchuixue -- 自定义即可
# 其他可以为空 # 会要求填写下列信息
# Country Name -- 国名 -- cn
# State or Province -- 州或省名 -- beijing
# Locality Name -- 城市或区域名 --beijing
# Organization Name -- 组织名 -- jtthink
# Organizational Unit Name -- 组织单位名 -- jt
# Common Name -- 域名(要求一致) -- localhost --> 这个才是最重要的
# Email Address -- 邮箱地址 -- 可以不填

4. 生成服务端证书

  • 生成服务端证书 - key
openssl genrsa -out server.key 4096
# 服务端证书 key
  • 新建 tls.conf 文件,并写入以下内容,该文件作为生成客户端证书与服务端证书根文件
# 新建 tls.conf文件,写入以下内容
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = v3_req
prompt = no # 不使用提示符,进入交互界面,因为使用默认会得到一个空主题,所以报错 [req_distinguished_name]
# countryName = cn
# stateOrProvinceName = beijing
# localityName = beijing
# organizationName = company name
commonName = beimenchuixue [ v3_req ]
subjectAltName = @alt_names [ alt_names ]
DNS.1=localhost #可以使用通配符
IP.1=127.0.0.1
  • 生成服务端 csr 文件
openssl req -new -key server.key -out server.csr -config tls.conf -sha256
# 生成服务端 server.csr 文件
  • 依据CA证书签发服务端证书
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -extfile tls.conf -extensions v3_req
# 签发证书 生成服务端 server.crt文件

5. 生成客户端证书

  • 生成客户端证书 - key
openssl genrsa -out client.key 4096
# 客户端证书 key
  • 生成客户端 csr 文件
openssl req -new -key client.key -out client.csr -config tls.conf -sha256
# 生成客户端 client.csr文件
# 使用的 tls文件与服务使用的一致
  • 依据CA证书签发客户端证书
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt -extfile tls.conf -extensions v3_req
# 生成客户端证书文件 client.crt

6. Grpc服务端带证书验证 -- 双向验证

package main

import (
"context"
"crypto/tls"
"crypto/x509"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"io/ioutil"
"learn-go-project/service"
"log"
"net"
) // ImplementProductService 定义产品服务实现类
type ImplementProductService struct { } // GetProductStoreNums 实现 proto buffer文件中service 定义的rpc方法 ==> 实现 pb文件中 rpc方法生成的接口
func (s *ImplementProductService) GetProductStoreNums(ctx context.Context, in *service.ProductRequest) (*service.ProductResponse, error) {
fmt.Println(in.GetProductId())
return &service.ProductResponse{ProductStore: 20}, nil
} func main() { // 1. 服务端的证书, 证书文件都保存在项目的cert目录下或其他指定项目目录下
cert, err := tls.LoadX509KeyPair("cert/server.crt", "cert/server.key")
if err != nil {
log.Fatalln(err)
}
// 2. ca证书
ca, err := ioutil.ReadFile("cert/ca.crt")
if err != nil {
log.Fatalln(err)
}
// 3. 证书池添加CA证书
certPool := x509.NewCertPool()
certPool.AppendCertsFromPEM(ca) // 4. 生成证书对象
certs := credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{cert},
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: certPool,
}) // 1. 声明一个grpc服务, 配置cert证书
grpcService := grpc.NewServer(grpc.Creds(certs)) // 2. 将实现类注册到生成的pd文件中
service.RegisterProductServiceServer(grpcService, &ImplementProductService{}) // 3. 启动tcp服务
l, err := net.Listen("tcp", ":9988")
if err != nil {
log.Fatalln(err)
} // 3. 让grp去处理tcp连接
err = grpcService.Serve(l)
if err != nil {
log.Fatalln(err)
}
}

6. Grpc客户端带证书验证 -- 双向验证

package main

import (
"context"
"crypto/tls"
"crypto/x509"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"io/ioutil"
"learn-go-project/service"
"log"
) func main() {
// 1. 服务端的证书
cert, err := tls.LoadX509KeyPair("cert/client.crt", "cert/client.key")
if err != nil {
log.Fatalln(err)
}
// 2. ca证书
ca, err := ioutil.ReadFile("cert/ca.crt")
if err != nil {
log.Fatalln(err)
}
// 3. 证书池添加CA证书
certPool := x509.NewCertPool()
certPool.AppendCertsFromPEM(ca) // 4. 生成证书对象
certs := credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{cert}, // 加载客户端证书
RootCAs: certPool, // CA根证书
}) // 1. 创建grpc客户端连接, 使用cert证书
conn, err := grpc.Dial("127.0.0.1:9988", grpc.WithTransportCredentials(certs))
if err != nil {
log.Fatalln(err)
}
defer conn.Close() // 2. 创建对应服务的连接
cli := service.NewProductServiceClient(conn) // 3. 调用方法,获取响应体
response, err := cli.GetProductStoreNums(context.Background(), &service.ProductRequest{ProductId: 50})
if err != nil {
log.Fatalln(err)
} fmt.Println(response.ProductStore)
}

7. Grpc服务端带证书认证 -- 单向认证

package main

import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"learn-go-project/service"
"log"
"net"
) // ImplementProductService 定义产品服务实现类
type ImplementProductService struct { } // GetProductStoreNums 实现 proto buffer文件中service 定义的rpc方法 ==> 实现 pb文件中 rpc方法生成的接口
func (s *ImplementProductService) GetProductStoreNums(ctx context.Context, in *service.ProductRequest) (*service.ProductResponse, error) {
fmt.Println(in.GetProductId())
return &service.ProductResponse{ProductStore: 100}, nil
} func main() {
// 单向认证 客户端与服务端公用同一个crt文件
cert, err := credentials.NewServerTLSFromFile("cert/server.crt", "cert/server.key")
if err != nil {
log.Fatalln(err)
}
// 1. 声明一个grpc服务, 配置cert证书
grpcService := grpc.NewServer(grpc.Creds(cert)) // 2. 将实现类注册到生成的pd文件中
service.RegisterProductServiceServer(grpcService, &ImplementProductService{}) // 3. 启动tcp服务
l, err := net.Listen("tcp", ":9988")
if err != nil {
log.Fatalln(err)
} // 3. 让grp去处理tcp连接
err = grpcService.Serve(l)
if err != nil {
log.Fatalln(err)
}
}

8. Grpc客户端带证书认证 -- 单向认证

package main

import (
"context"
"fmt"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"learn-go-project/service"
"log"
) func main() {
// 服务端和客户端公用同一个由CA证书签发的crt和key文件,客户端只需要服务端的crt文件
cert, err := credentials.NewClientTLSFromFile("cert/server.crt", "localhost")
if err != nil {
log.Fatalln(err)
} // 1. 创建grpc客户端连接, 使用cert证书
conn, err := grpc.Dial("127.0.0.1:9988", grpc.WithTransportCredentials(cert))
if err != nil {
log.Fatalln(err)
}
defer conn.Close() // 2. 创建对应服务的连接
cli := service.NewProductServiceClient(conn) // 3. 调用方法,获取响应体
response, err := cli.GetProductStoreNums(context.Background(), &service.ProductRequest{ProductId: 50})
if err != nil {
log.Fatalln(err)
} fmt.Println(response.ProductStore)
}

http-自签证书的更多相关文章

  1. Linux中Nginx中添加自签证书TLS

    创建自签证书TLS openssl req \ -newkey rsa: \ -x509 \ -nodes \ -keyout test.com.key \ -new \ -out test.com. ...

  2. jdk keytool 自签证书

    jdk keytool 自签证书 https需要用到ssl证书,可以从阿里等平台申请,本文采用jdk keytool进行自签证书. 生成环境:linux 用jdk自带keytool工具生成密钥库 ke ...

  3. OpenSSL - 利用OpenSSL自签证书和CA颁发证书

    秘钥操作 这个命令会生成一个1024/2048位的密钥,包含私钥和公钥. openssl genrsa -out private.key 1024/2038                     ( ...

  4. openssl CA 自签证书,阿里云配置tomcat https

    <一,openssl CA自签发证书> 1,生成私钥 openssl genrsa 1024 > private.key;

  5. OPENSSL生成SSL自签证书

    OPENSSL生成SSL自签证书 目前,有许多重要的公网可以访问的网站系统(如网银系统)都在使用自签SSL证书,即自建PKI系统颁发的SSL证书,而不是部署支持浏览器的SSL证书. 支持浏览器的SSL ...

  6. 使用cfssl生成自签证书

    安装ssl wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_li ...

  7. Nginx 颁发自签证书

    首先,确保安装了OpenSSL库,并且安装Nginx时使用了–with-http_ssl_module参数. 1:进入生成证书的目录 cd /usr/local/nginx/conf 2:使用open ...

  8. CentOS6系统openssl生成证书和自签证书

    CentOS6系统openssl生成证书和自签证书的过程,记录一下,本文基于CentOS 6 64bit.$ yum install openssl openssl-devel 1,生成服务器端的私钥 ...

  9. Window下生成OpenSSL自签证书

    :OPenSSL下载地址:https://www.openssl.org/source/ 编译好的OpenSSL下载地址: http://slproweb.com/products/Win32Open ...

  10. Windows下使用OpenSSL生成自签证书

    下载OpenSSLhttp://slproweb.com/products/Win32OpenSSL.html 生成证书 生成crt证书CMD进入安装bin目录,执行命令:openssl req -x ...

随机推荐

  1. 监控工具nmon使用方法

    https://blog.csdn.net/linabc123000/article/details/70833427

  2. 痞子衡嵌入式:Farewell, 我的写博故事2023

    -- 题图:苏州虎丘塔 2023 年的最后一天,照旧写个年终总结.昨晚和同门师兄弟一起吃饭,有个师弟告诉痞子衡,微博上一个拥有 22.3W 粉丝的嵌入式同行今年 4 月发过一个吐槽微博,说恩智浦 MC ...

  3. 解密Prompt系列22. LLM Agent之RAG的反思:放弃了压缩还是智能么?

    已经唠了三章的RAG,是时候回头反思一下,当前的RAG是解决幻觉的终点么?我给不出直接的答案,不过感觉当前把RAG当作传统搜索框架在大模型时代下的改良,这个思路的天花板高度有限~ 反思来源于对RAG下 ...

  4. 在centos7.9中 修改docker0 的网卡默认IP地址

    docker0网卡的默认IP地址为172.17.0.1/16 因此很可能会与企业网中的业务地址冲突,为了解决这个问题,必须修改docker0的网卡配置,操作如下 1.查看网卡docker0的默认地址  ...

  5. wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】

    引言 最近小伙伴告诉我一种新的方法,可以使用wasm来使浏览器网页能够运行Python代码.这一下子激起了我的兴趣,因为这意味着用户无需安装Python环境就能直接运行我的demo,这真是太方便了.所 ...

  6. 6.elasticsearch中search template和alias

    什么是search template 顾名思义,查询模版,就是提前设定好查询的DSL,再次查询时,只需要指定对应的模版,然后传入相应的参数就好.一是可以每次不用构建复杂的DSL,二是可以供开发直接使用 ...

  7. [python]常用配置读取方法

    前言 常见的应用配置方式有环境变量和配置文件,对于微服务应用,还会从配置中心加载配置,比如nacos.etcd等,有的应用还会把部分配置写在数据库中.此处主要记录从环境变量..env文件..ini文件 ...

  8. 云原生批量计算引擎 Volcano社区v1.8.0版本正式发布

    本文分享自华为云社区<云原生批量计算引擎 Volcano社区v1.8.0版本正式发布>,作者: 云容器大未来. 北京时间2023年8月17日,Volcano 社区 v1.8.0 版本正式发 ...

  9. 揭开KPI异常检测顶级AI模型面纱

    摘要:2020GDE全球开发者大赛-KPI异常检测告一段落,来自深圳福田莲花街道的"原子弹从入门到精通"有幸取得了总榜TOP1的成绩,在这里跟大家分享深圳福田莲花街道在本次比赛的解 ...

  10. 拥有5大核心竞争力的华为云GaussDB,成SACC2021最靓那一个…

    摘要:华为云NoSQL数据库架构师余汶龙受邀参加第十三届中国系统架构师大会(SACC2021)并发表了重要演讲,分享了GaussDB(for Redis)的存算分离架构设计理念以及构筑的产品核心竞争力 ...