golang實現openssl自簽名雙向認證

第一步:生成CA、服務端、客戶端證書

1. 生成CA根證書
  • 生成CA證書私鑰
openssl genrsa -out ca.key 4096
  • 創建ca.conf 文件
[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = JiangSu
localityName                = Locality Name (eg, city)
localityName_default        = NanJing
organizationName            = Organization Name (eg, company)
organizationName_default    = Sheld
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = localhost
  • 生成根證書簽發申請文件(csr文件)
openssl req \-new \-sha256 \-out ca.csr \-key ca.key \-config ca.conf
  • 生成自簽發根證書(crt文件)
openssl x509 \-req \-days 3650 \-in ca.csr \-signkey ca.key \-out ca.pem
2. 生成服務端證書
  • 生成服務端私鑰
openssl genrsa -out server.key 2048
  • 創建 server.conf 文件
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name
req_extensions     = req_ext[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = JiangSu
localityName                = Locality Name (eg, city)
localityName_default        = NanJing
organizationName            = Organization Name (eg, company)
organizationName_default    = Sheld
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = localhost    # 此處尤為重要,需要用該服務名字填寫到客戶端的代碼中[ req_ext ]
subjectAltName = @alt_names[alt_names]
DNS.1   = localhost
IP.1      = 127.0.0.1
  • 生成服務端簽發申請文件(csr文件)
openssl req \-new \-sha256 \-out server.csr \-key server.key \-config server.conf
  • 使用CA證書簽署服務器證書
openssl x509 \-req \-days 3650 \-CA ca.pem \-CAkey ca.key \-CAcreateserial \-in server.csr \-out server.pem \-extensions req_ext \-extfile server.conf
3. 生成客戶端證書
  • 生成客戶端私鑰
openssl genrsa -out client.key 2048
  • 創建 client.conf 文件
[ req ]
default_bits       = 2048
distinguished_name = req_distinguished_name[ req_distinguished_name ]
countryName                 = Country Name (2 letter code)
countryName_default         = CN
stateOrProvinceName         = State or Province Name (full name)
stateOrProvinceName_default = JiangSu
localityName                = Locality Name (eg, city)
localityName_default        = NanJing
organizationName            = Organization Name (eg, company)
organizationName_default    = Sheld
commonName                  = Common Name (e.g. server FQDN or YOUR name)
commonName_max              = 64
commonName_default          = localhost
  • 生成客戶端端簽發申請文件(csr文件)
openssl req \-new \-sha256 \-out client.csr \-key client.key \-config client.conf
  • 使用CA證書簽署客戶端器證書
openssl x509 \-req \-days 3650 \-CA ca.pem \-CAkey ca.key \-CAcreateserial \-in client.csr \-out client.pem

第二步:golang 服務端、客戶端代碼編寫

1. 項目目錄結構

在這里插入圖片描述

2. 服務端代碼:server.go
package mainimport ("crypto/tls""crypto/x509""fmt""net/http""os"
)type MyHandler struct {
}func (h *MyHandler) ServeHTTP(w http.ResponseWriter,r *http.Request) {fmt.Fprint(w, "Hello, HTTPS!")
}func main() {pool := x509.NewCertPool() // 創建證書池caCertPath := "./cert/ca.pem"caCrt, err := os.ReadFile(caCertPath) // 讀取本地CA證書文件if err != nil {fmt.Println("ReadFile err:", err)return}pool.AppendCertsFromPEM(caCrt) // 將證書添加到證書池中s := &http.Server{ // 創建 HTTP服務器實例,并設置服務器的監聽地址(本例中是127.0.0.1:8088)、處理器(即上面定義的myhandler結構體)、以及TLS配置。Addr:    "127.0.0.1:8088",Handler: &MyHandler{},TLSConfig: &tls.Config{ClientCAs:  pool,                           // 指定客戶端需要驗證的CA證書池(即上面創建的pool)ClientAuth: tls.RequireAndVerifyClientCert, // 要求客戶端在發送請求時必須攜帶證書},}err = s.ListenAndServeTLS("./cert/server.pem", "./cert/server.key")if err != nil {fmt.Println("ListenAndServeTLS err:", err)}
}
3. 客戶端代碼:client.go
package mainimport ("crypto/tls""crypto/x509""fmt""io""net/http""os"
)func main() {pool := x509.NewCertPool()    // 創建 x509.CertPool,用于存儲CA證書caCertPath := "./cert/ca.pem" // 從文件中讀取CA證書的內容caCrt, err := os.ReadFile(caCertPath)if err != nil {fmt.Println("ReadFile err:", err)return}pool.AppendCertsFromPEM(caCrt)                                               // 將CA證書添加到CertPool中cliCrt, err := tls.LoadX509KeyPair("./cert/client.pem", "./cert/client.key") //加載客戶端證書和私鑰if err != nil {fmt.Println("Loadx509keypair err:", err)return}tr := &http.Transport{ // 創建一個http.Transport,并配置TLS相關信息TLSClientConfig: &tls.Config{RootCAs:      pool,                      // 設置根證書池Certificates: []tls.Certificate{cliCrt}, // 設置客戶端證書和私鑰},}client := &http.Client{Transport: tr}             // 創建一個http.Client,并設置Transport為上面創建的Transport對象resp, err := client.Get("https://127.0.0.1:8088") // 使用創建的Client發送GET請求if err != nil {fmt.Println("Http Get error:", err)return}defer resp.Body.Close()body, err := io.ReadAll(resp.Body) // 讀取并打印響應體的內容fmt.Println(string(body))
}

第三步:驗證

1. 運行服務端
go run ./server/server.go

在這里插入圖片描述

2. 運行客戶端

運行客戶端

go run ./client/client.go

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node.js基礎---Express路由

1. 路由的概念 1. 什么是路由 廣義上來講,路由就是映射關系 2. Express 中的路由 在 Express 中,路由指的是客戶端的請求與服務器處理函數之間的映射關系 Express 中的路由分三部分:請求的類型、請求的URL地址,處理函數。如下&am…

怎么使用curl2py自動構造爬蟲代碼并進行網絡爬蟲

目錄 一、了解curl2py 二、安裝curl2py 三、使用curl2py生成爬蟲代碼 四、實際案例:爬取網頁數據 五、總結與建議 在當今數據驅動的時代,網絡爬蟲成為了獲取數據的重要工具。對于初學者來說,手動編寫爬蟲代碼可能是一項挑戰。幸運的是&a…

PyTorch-神經網絡

神經網絡,這也是深度學習的基石,所謂的深度學習,也可以理解為很深層的神經網絡。說起這里,有一個小段子,神經網絡曾經被打入了冷宮,因為SVM派的崛起,SVM不了解的同學可以去google一下&#xff0…

JavaScript 基礎學習筆記(五):函數、作用域、匿名函數

目錄 一、函數 1.1 聲明和調用 1.2 形參和實參 1.3 返回值 二、作用域 2.1 全局作用域 2.2 局部作用域 三、匿名函數 3.1 函數表達式 3.2 立即執行函數 一、函數 理解函數的封裝特性,掌握函數的語法規則 1.1 聲明和調用 函數可以把具有相同或相似邏輯的代…

NLP_文本張量表示方法(代碼示例)

目標 了解什么是文本張量表示及其作用.文本張量表示的幾種方法及其實現. 1 文本張量表示 將一段文本使用張量進行表示,其中一般將詞匯為表示成向量,稱作詞向量,再由各個詞向量按順序組成矩陣形成文本表示. ["人生", "該&q…

無極低碼:五分鐘快速上手,開啟編程新時代

無極低碼平臺憑借其革命性的設計理念和強大的功能特性,正在徹底改變軟件開發的傳統格局。該平臺專為開發者、初創企業和各類研發團隊量身打造,旨在提供一種快速而高效的解決方案,以應對日益增長的業務需求和技術挑戰。 1.無極低碼的核心價值在…

2024《》

vue-cli到哪做了那些事 vue-cli是vue.js的腳手架,用于自動生成vue.jswebpack的項目模板,快速搭建Vue.js項目。 vue cli內置了webpack的一些功能,這些是用webpack打包時需要我們自己配置的,例如: 1.ES6代碼轉換成ES5代…

Linux 實現打印彩色進度條

文章目錄 預備知識一、理解回車換行二、認識行緩沖1、代碼一、二(回車換行理解)2、代碼三、四(sleep函數和ffush函數理解) 三、簡單倒計時1. 倒計時代碼2、效果展示 四、進度條1、效果展示2、進度條代碼makefileProcessBar.hProce…

tomcat 反向代理 自建博客 修改狀態頁 等

一 自建博客 隨后&#xff0c;拷貝到webapps下面 并且做軟連接 隨后重定向 并且下載 cat >/etc/yum.repos.d/mysql.repo <<EOF [mysql57-community] nameMySQL 5.7 Community Server baseurlhttp://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/ enabled1 g…

團體程序設計天梯賽 L2-006 樹的遍歷

L2-006 樹的遍歷 分數 25 給定一棵二叉樹的后序遍歷和中序遍歷&#xff0c;請你輸出其層序遍歷的序列。這里假設鍵值都是互不相等的正整數。 輸入格式&#xff1a; 輸入第一行給出一個正整數N&#xff08;≤30&#xff09;&#xff0c;是二叉樹中結點的個數。第二行給出其后…

【Linux】Linux系統磁盤分區和掛載相關命令介紹

Linux系統磁盤分區和掛載相關命令介紹 文章目錄 Linux系統磁盤分區和掛載相關命令介紹磁盤分區1、使用fdisk創建分區2、使用parted創建分區 格式化分區分區掛載自動掛載其他常見&#xff08;用&#xff09;的磁盤相關命令 在Linux系統中&#xff0c;磁盤分區和磁盤掛載是管理存…

第十四屆藍橋杯大賽B組 JAVA 蝸牛 (遞歸剪枝)

題目描述&#xff1a; 這天&#xff0c;一只蝸牛來到了二維坐標系的原點。 在 x 軸上長有 n 根竹竿。它們平行于 y 軸&#xff0c;底部縱坐標為 0&#xff0c;橫坐標分別為 x1, x2, …, xn。竹竿的高度均為無限高&#xff0c;寬度可忽略。蝸牛想要從原點走到第 n 個竹竿的底部也…

全域電商數據集成管理與采集|API接口的采集與管理

如今&#xff0c;全渠道零售已是大勢所趨。企業電商經營的一大現狀就是數據分散各處&#xff0c;比如有來自電商平臺私域數據、品牌一方數據、公開的第三方行業數據與電商平臺C端頁面數據等等。如何集成全域數據日益成為企業數字化基建的難題。 當前電商數據集成的主流方案為人…

【基于Matlab GUI的語音降噪系統設計】

客戶不要了&#xff0c;掛網上吧&#xff0c;有需要自行下載~ 賺點辛苦費 ** 功能實現: ** 1、導入音頻文件/錄入音頻&#xff0c;能實現播放功能。 2、對導入/錄入的音頻信號進行時域和頻域分析&#xff0c;并制圖。 3、可在導入/錄入的音頻信號上加入噪聲&#xff0c;并能夠播…

Apache JMeter 5.6.3 安裝

源碼下載 curl -O https://dlcdn.apache.org//jmeter/source/apache-jmeter-5.6.3_src.zipJMeter 下載 curl -O https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zipjmeter.properties 里 設置中文 windows系統上解壓&#xff0c;雙擊jmeter.bat 啟動 執行參…

【人工智能】DeepLearning學習路線及簡要說明

目錄 神經網絡 1.1 前饋神經網絡(FNN) 結構和工作原理 訓練過程 應用

架構設計方法(4A架構)-應用架構

1、應用架構&#xff08;AA&#xff09;&#xff1a;業務價值與產品之間的橋梁&#xff0c;是企業架構的一個子集 2、應用架構包含“應用系統模塊、應用服務、應用系統集成”3個關鍵要素 3、收集AS-IS應用架構&#xff0c;描繪現狀&#xff0c;并識別改進機會點 4、描述對新系統…

uniapp 安卓YYEVAPlayer MP4禮物播放器原生插件

插件介紹 安卓YYEVAPlayer MP4禮物播放器原生插件&#xff0c;是一個輕量的動畫渲染庫&#xff0c;使用Native Opengles 渲染視頻&#xff0c;為你提供高性能、低開銷的動畫體驗 對比傳統的序列幀的動畫播放方式&#xff0c;具有更高的壓縮率&#xff0c;硬解碼效率更高的優點…

【NR 定位】3GPP NR Positioning 5G定位標準解讀(四)

目錄 前言 6 Signalling protocols and interfaces 6.1 支持定位操作的網絡接口 6.1.1 通用LCS控制平面架構 6.1.2 NR-Uu接口 6.1.3 LTE-Uu接口 6.1.4 NG-C接口 6.1.5 NL1接口 6.1.6 F1接口 6.1.7 NR PC5接口 6.2 終端協議 6.2.1 LTE定位協議&#xff08;LPP&#x…

TikTok企業認證教程:提升賬號可信度的必備步驟

TikTok企業認證是TikTok平臺用來驗證賬號真實性和權威性的方式。通過企業認證之后&#xff0c;企業能在TikTok上獲得官方標識&#xff0c;可以增強品牌的專業形象&#xff0c;也有利于提升用戶對企業內容的信任度。而且通過TikTok企業認證還可以解鎖高級功能&#xff0c;如數據…