国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[grpc]雙向tls加密認(rèn)證

這篇具有很好參考價(jià)值的文章主要介紹了[grpc]雙向tls加密認(rèn)證。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

假設(shè)gRPC服務(wù)端的主機(jī)名為qw.er.com,需要為gRPC服務(wù)端和客戶端之間的通信配置tls雙向認(rèn)證加密。

生成證書

  1. 生成ca根證書。生成過程會(huì)要求填寫密碼、CN、ON、OU等信息,記住密碼。
openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -subj "/CN=qw.er.com" -days 365
  1. 新建并編輯文件openssl.cnf文件。req_distinguished_name中內(nèi)容按需填寫,DNS.1要替換成實(shí)際域名。
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
prompt = no

[req_distinguished_name]
countryName = CN
stateOrProvinceName = Anhui
localityName = Hefei
organizationName = zhangsan
commonName = qw.er.com

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = qw.er.com
  1. 生成服務(wù)端證書
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/CN=qw.er.com" -config openssl.cnf

# 提示輸入ca私鑰的密碼
openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -extensions v3_req -extfile openssl.cnf
  1. 生成客戶端證書
openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -subj "/CN=qw.er.com" -config openssl.cnf

# 提示輸入ca私鑰的密碼
openssl x509 -req -in client.csr -out client.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -extensions v3_req -extfile openssl.cnf

proto示例

用的還是入門級(jí)的helloworld

syntax = "proto3";   // protocol buffers版本
option go_package = "./;proto";   // 生成的Go代碼將被放在當(dāng)前目錄,并使用proto作為包名稱

// 定義grpc服務(wù)的接口。服務(wù)就是一組可被遠(yuǎn)程調(diào)用的方法
service Greeter {
	// 定義遠(yuǎn)程調(diào)用方法
    rpc SayHello (HelloRequest) returns (HelloReply);
}

// 定義消息格式和消息類型
message HelloRequest {
    string name = 1; // 1 是二進(jìn)制格式中的字段編號(hào), 應(yīng)該唯一
}

message HelloReply {
    string message = 1;
}

生成go代碼:

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative hello.proto

服務(wù)端代碼示例

如果需要客戶端和服務(wù)端直接通信,可以參考以下示例代碼。

package main

import (
	pb "grpcs/proto"
	"context"
	"crypto/tls"
	"crypto/x509"
	"flag"
	"fmt"
	"log"
	"net"
	"os"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

var (
	port    = flag.Int("port", 8010, "the server port")
	crtFile = flag.String("crt", "server.crt", "the server crt file")
	keyFile = flag.String("key", "server.key", "the server key file")
	caFile  = flag.String("ca", "ca.crt", "the server ca file")
)

type server struct{
	pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
	flag.Parse()

	// 通過服務(wù)端的證書和密鑰直接創(chuàng)建X.509密鑰對(duì)
	certificate, err := tls.LoadX509KeyPair(*crtFile, *keyFile)
	if err != nil {
		log.Fatalf("Failed to load key pair: %v", err)
	}

	// 通過CA創(chuàng)建證書池
	certPool := x509.NewCertPool()
	ca, err := os.ReadFile(*caFile)
	if err != nil {
		log.Fatalf("Failed to read ca: %v", err)
	}

	// 將來自CA的客戶端證書附加到證書池
	if ok := certPool.AppendCertsFromPEM(ca); !ok {
		log.Fatalf("Failed to append ca certificate")
	}

	opts := []grpc.ServerOption{
		grpc.Creds( // 為所有傳入的連接啟用TLS
			credentials.NewTLS(&tls.Config{
				ClientAuth: tls.RequireAndVerifyClientCert,
				Certificates: []tls.Certificate{certificate},
				ClientCAs: certPool,
			},
		)),
	}

	listen, err := net.Listen("tcp", fmt.Sprintf("0.0.0.0:%d", *port))
	if err != nil {
		log.Fatalf("failed to listen %d port", *port)
	}
	// 通過傳入的TLS服務(wù)器憑證創(chuàng)建新的gRPC服務(wù)實(shí)例
	s := grpc.NewServer(opts...)
	pb.RegisterGreeterServer(s, &server{})
	log.Printf("server listening at %v", listen.Addr())
	if err := s.Serve(listen); err != nil {
		log.Fatalf("Failed to serve: %v", err)
	}
}

運(yùn)行:

go build -o server.bin
./server.bin -ca ca.crt -crt server.crt -key server.key -port 8010

客戶端代碼示例

package main

import (
	pb "grpcc/proto"
	"context"
	"crypto/tls"
	"crypto/x509"
	"flag"
	"log"
	"os"
	"time"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

var (
	addr     = flag.String("addr", "qw.er.com:8010", "server address")
	hostname = flag.String("host", "qw.er.com", "server hostname")
	crtFile  = flag.String("crt", "client.crt", "client crt file")
	keyFile  = flag.String("key", "client.key", "client key file")
	caFile   = flag.String("ca", "ca.crt", "ca file")
	name = flag.String("n", "zhangsan", "name")
)

func main() {
	flag.Parse()

	certificate, err := tls.LoadX509KeyPair(*crtFile, *keyFile)
	if err != nil {
		log.Fatalf("Failed to load client key pair, %v", err)
	}

	certPool := x509.NewCertPool()
	ca, err := os.ReadFile(*caFile)
	if err != nil {
		log.Fatalf("Failed to read %s, error: %v", *caFile, err)
	}

	if ok := certPool.AppendCertsFromPEM(ca); !ok {
		log.Fatalf("Failed to append ca certs")
	}

	opts := []grpc.DialOption{
		grpc.WithTransportCredentials(credentials.NewTLS(
			&tls.Config{
				ServerName:   *hostname,
				Certificates: []tls.Certificate{certificate},
				RootCAs:      certPool,
			})),
	}

	// conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
	conn, err := grpc.Dial(*addr, opts...)
	if err != nil {
		log.Fatalf("Connect to %s failed", *addr)
	}
	defer conn.Close()

	client := pb.NewGreeterClient(conn)
	// 創(chuàng)建帶有超時(shí)時(shí)間的上下文, cancel可以取消上下文
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*3)
	defer cancel()

	// 業(yè)務(wù)代碼處理部分 ...
	r, err := client.SayHello(ctx, &pb.HelloRequest{Name: *name})
	if err != nil {
		log.Printf("Failed to greet, error: %v", err)
	} else {
		log.Printf("Greeting: %v",r.GetMessage())
	}
}

運(yùn)行:

go build -o client.bin
./client.bin -addr qw.er.com:8010 -host qw.er.com -ca ca.crt -crt client.crt -key client.key -name 'lisi'

nginx代理

某些場景下服務(wù)端和客戶端無法直接通信,需要在中間加個(gè)nginx反向代理服務(wù)端。目前個(gè)人方案是客戶端與nginx之間為https雙向加密通信,nginx與服務(wù)端之間為http普通通信。

客戶端代碼無需改動(dòng),服務(wù)端就是去掉tls相關(guān)配置,示例:

package main

import (
	"context"
	"flag"
	"fmt"
	"log"
	"net"

	pb "grpcs/proto"

	"google.golang.org/grpc"
)

var (
	port = flag.Int("port", 8010, "The server port")
)

// server is used to implement hello.GreeterServer.
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHello 實(shí)現(xiàn) proto 中的 service Greeter
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
	flag.Parse()
	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})
	log.Printf("server listening at %v", lis.Addr())
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

tls證書配到nginx:文章來源地址http://www.zghlxwxcb.cn/news/detail-622562.html

server {
    listen       80 ssl http2;
    server_name  qw.er.com;

	# 證書文件路徑
    ssl_certificate /home/admin/apps/openresty/nginx/certs/qwer/server.crt;
    ssl_certificate_key /home/admin/apps/openresty/nginx/certs/qwer/server.key;
    # 驗(yàn)證客戶端證書
    ssl_verify_client on;
    ssl_client_certificate /home/admin/apps/openresty/nginx/certs/qwer/ca.crt;

	# 反向代理服務(wù)端
    location / {
        grpc_pass grpc://192.168.1.111:8010;
    }
}

到了這里,關(guān)于[grpc]雙向tls加密認(rèn)證的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [golang]使用mTLS雙向加密認(rèn)證http通信

    [golang]使用mTLS雙向加密認(rèn)證http通信

    假設(shè)一個(gè)場景,服務(wù)端部署在內(nèi)網(wǎng),客戶端需要通過暴露在公網(wǎng)的nginx與服務(wù)端進(jìn)行通信。為了避免在公網(wǎng)進(jìn)行 http 明文通信造成的信息泄露,nginx與客戶端之間的通信應(yīng)當(dāng)使用 https 協(xié)議,并且nginx也要驗(yàn)證客戶端的身份,也就是mTLS雙向加密認(rèn)證通信。 這條通信鏈路有三個(gè)角

    2024年02月14日
    瀏覽(19)
  • PostgreSQL安裝和開啟SSL加密連接【配置單/雙向認(rèn)證】

    PostgreSQL安裝和開啟SSL加密連接【配置單/雙向認(rèn)證】

    SSL單向認(rèn)證和雙向認(rèn)證: SSL單向認(rèn)證 :只有一端校驗(yàn)對(duì)端的證書合法性,通常都是客戶端來校驗(yàn)服務(wù)器的合法性。即在一般的單向認(rèn)證中,只要求服務(wù)器端部署了ssl證書就行,客戶端可以無證書,任何用戶都可以去訪問服務(wù)端,服務(wù)端只是提供了身份認(rèn)證。 client: 無證書

    2024年02月06日
    瀏覽(27)
  • QtWebApp開發(fā)https服務(wù)器,完成客戶端與服務(wù)器基于ssl的雙向認(rèn)證,純代碼操作

    引言:所謂http協(xié)議,本質(zhì)上也是基于TCP/IP上服務(wù)器與客戶端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn),web開發(fā)中常用的http server有apache和nginx。Qt程序作為http client可以使用QNetworkAccessManager很方便的進(jìn)行http相關(guān)的操作。 Qt本身并沒有http server相關(guān)的庫 ,也許是因?yàn)楹苌儆羞@種需求吧。但是實(shí)際開發(fā)中

    2024年02月14日
    瀏覽(27)
  • 搭建Radius認(rèn)證服務(wù)器 安當(dāng)加密

    搭建Radius認(rèn)證服務(wù)器需要完成以下步驟: 安裝Radius服務(wù)器軟件??梢赃x擇使用FreeRadius、Radiusd或WinRadius等開源軟件,也可以選擇使用商業(yè)軟件如Cisco或 安當(dāng)ASP 等。 配置認(rèn)證數(shù)據(jù)庫。在Radius服務(wù)器上配置認(rèn)證數(shù)據(jù)庫,用于存儲(chǔ)用戶信息和認(rèn)證信息。可以選擇使用常見的數(shù)據(jù)庫

    2024年02月05日
    瀏覽(20)
  • springboot整合https使用自簽名證書實(shí)現(xiàn)瀏覽器和服務(wù)器之間的雙向認(rèn)證

    springboot整合https使用自簽名證書實(shí)現(xiàn)瀏覽器和服務(wù)器之間的雙向認(rèn)證

    效果描述: 本地環(huán)境? 兩臺(tái)以上電腦? 可以實(shí)現(xiàn)安裝客戶端證書的電腦可以訪問springboot啟動(dòng)項(xiàng)目,沒有安裝客戶端證書的電腦無法訪問springboot啟動(dòng)項(xiàng)目 1.操作:需要安裝openssl工具 工具包:Win64OpenSSL_Light-3_3_0.exe 或者Win64OpenSSL_Light-3_3_0.msi? 官網(wǎng):[ Downloads ] - /source/index.html

    2024年04月28日
    瀏覽(21)
  • .netcore grpc雙向流方法詳解

    .netcore grpc雙向流方法詳解

    簡單來講客戶端可以向服務(wù)端發(fā)送消息流,服務(wù)端也可以向客戶端傳輸響應(yīng)流,即客戶端和服務(wù)端可以互相通訊 客戶端無需發(fā)送消息即可開始雙向流式處理調(diào)用 。 客戶端可選擇使用? RequestStream.WriteAsync ?發(fā)送消息。 使用? ResponseStream.MoveNext() ?或? ResponseStream.ReadAllAsync() ?可

    2024年02月13日
    瀏覽(25)
  • grpc介紹(二)——認(rèn)證方式

    grpc介紹(二)——認(rèn)證方式

    HTTP是明文傳輸?shù)?,即客戶端與服務(wù)端之間通信的信息是可見的,這就存在被竊聽、冒充或篡改的風(fēng)險(xiǎn)。HTTPS在HTTP和TCP之間加入了TLS協(xié)議,如圖所示: TLS協(xié)議主要解決了以下三個(gè)網(wǎng)絡(luò)安全問題: 信息加密 : HTTP 交互信息是被加密的,第三方就無法被竊??; 校驗(yàn)機(jī)制 :校驗(yàn)信

    2023年04月23日
    瀏覽(22)
  • EMQX啟用雙向SSL/TLS安全連接以及java連接

    EMQX啟用雙向SSL/TLS安全連接以及java連接

    作為基于現(xiàn)代密碼學(xué)公鑰算法的安全協(xié)議,TLS/SSL 能在計(jì)算機(jī)通訊網(wǎng)絡(luò)上保證傳輸安全,EMQX 內(nèi)置對(duì) TLS/SSL 的支持,包括支持單/雙向認(rèn)證、X.509 證書、負(fù)載均衡 SSL 等多種安全認(rèn)證。你可以為 EMQX 支持的所有協(xié)議啟用 SSL/TLS,也可以將 EMQX 提供的 HTTP API 配置為使用 TLS。 強(qiáng)認(rèn)證

    2024年02月11日
    瀏覽(27)
  • HTTPS、TLS加密傳輸

    1、HTTPS(HyperText Transfer Protocol Secure) HTTPS(HyperText Transfer Protocol Secure)是一種加密通信協(xié)議,用于在計(jì)算機(jī)網(wǎng)絡(luò)上進(jìn)行安全的數(shù)據(jù)傳輸。它使用TLS(Transport Layer Security)協(xié)議建立一個(gè)加密的連接,確保在客戶端和服務(wù)器之間傳輸?shù)臄?shù)據(jù)是加密和完整的。 2、TLS TLS是一個(gè)加密

    2024年02月14日
    瀏覽(19)
  • MQTT使用TLS加密

    MQTT使用TLS加密

    ????????使用TLS加密在MQTT的使用中是比較常見的,TLS加密過程在網(wǎng)上有很多說明,但是沒幾個(gè)應(yīng)用教程的,MQTT軟件中的EMQX軟件是支持TLS加密的,只不過要進(jìn)行一些設(shè)置。 首先先安裝EMQX軟件 軟件安裝說明 免費(fèi)下載、試用 EMQ 產(chǎn)品 (emqx.com) https://www.emqx.com/zh/try?product=broke

    2024年02月04日
    瀏覽(12)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包