已发表的技术专栏(订阅即可观看所有专栏)
0 grpc-go、protobuf、multus-cni 技术专栏 总入口
1 grpc-go 源码剖析与实战 文章目录
2 Protobuf介绍与实战 图文专栏 文章目录
3 multus-cni 文章目录(k8s多网络实现方案)
4 grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录
- 客户端要验证服务器端的证书,同样,服务器端也要验证客户端的证书
- 客户端一侧
- 需要加载根证书,或者给服务器端颁发证书的父证书,用来证明服务器端证书的有效性
- 客户端也需要加载自己的证书,以及证书密钥,将证书,证书密钥发送给服务器端,以供验证
- 服务器端一侧:
- 需要加载根证书,或者给客户端颁发证书的父证书,用来验证客户端证书的有效性
- 服务器端一侧,需要加载自己的证书,证书密钥;将证书,证书密钥发送给客户端以供校验
一次性方式生成根证书
openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=CN/ST=beijing/L=beijing/O=baidu/OU=bigdata/CN=www.golang.com/emailAddress=000000@qq.com"
![在这里插入图片描述](https://img-blog.csdnimg.cn/f17fb8109da44910a537510830fa83f8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.2.1、第一步:生成服务器端密钥和服务器端证书签名 (SAN类型,即多个域名生效) |
openssl req -newkey rsa:2048 -nodes -keyout server.key \
-subj "/C=CN/ST=beijing/L=beijing/O=baidu/OU=bigdata/CN=www.golang-server.com/emailAddress=123456789@qq.com" \
-reqexts SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.org.golang-server.com,DNS:www.golang-server.cn")) \
-out server.csr
![在这里插入图片描述](https://img-blog.csdnimg.cn/c99fa9b8900141ea8e0892fd637e8609.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
查看证书签名里,是否有SAN请求信息
openssl req -noout -text -in server.csr
![在这里插入图片描述](https://img-blog.csdnimg.cn/770ea4985ecc40b8821ac1b2087abe38.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.2.2、第二步:根据CA证书,来颁发服务器端证书 |
openssl x509 -req -days 365 \
-in server.csr -out server.crt \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-extensions SAN \
-extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:*.org.golang-server.com,DNS:www.golang-server.cn"))
![在这里插入图片描述](https://img-blog.csdnimg.cn/106ce23d208f4ff4af05e9be88f930af.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
openssl x509 -in server.crt -noout -text
![在这里插入图片描述](https://img-blog.csdnimg.cn/c8d886ee42bc4a24991e04f41f9908b2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.3.1、第一步:生成服务器端密钥和服务器端证书签名 (非SAN类型,客户端不需要被访问,不需要添加额外的域名) |
openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr -subj "/C=CN/ST=beijing/L=beijing/O=baidu/OU=bigdata/CN=www.golang-client.com/emailAddress=987654321@qq.com"
![在这里插入图片描述](https://img-blog.csdnimg.cn/57b62f0dc1474dab8ff3af7a159e23a1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2.3.2、第二步:根据CA证书,来颁发客户端证书 |
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
![在这里插入图片描述](https://img-blog.csdnimg.cn/1ea2a601197a4b60a000e4cbb7de7fd2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)
openssl x509 -noout -text -in client.crt
![在这里插入图片描述](https://img-blog.csdnimg.cn/c49ccf4b34a84b9c8ee462a04a7f340a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_19,color_FFFFFF,t_70,g_se,x_16#pic_center)
package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"net/http"
)
type MyMux struct {
}
func (p *MyMux) ServeHTTP(res http.ResponseWriter, req *http.Request) {
fmt.Fprintf(res, "this is http server!")
}
func main() {
pool := x509.NewCertPool()
caCertPath := "8-WithTransportCredentials/https/two-way-authentication/tls/ca.crt"
caCrt, err := ioutil.ReadFile(caCertPath)
if err != nil {
fmt.Println("ReadFile err:", err)
return
}
pool.AppendCertsFromPEM(caCrt)
s := &http.Server{
Addr: ":8080",
Handler: &MyMux{},
TLSConfig: &tls.Config{
ClientCAs: pool,
ClientAuth: tls.RequireAndVerifyClientCert,
},
}
err = s.ListenAndServeTLS("8-WithTransportCredentials/https/two-way-authentication/tls/server.crt", "8-WithTransportCredentials/https/two-way-authentication/tls/server.key")
if err != nil {
fmt.Println("ListenAndServeTLS err:", err)
}
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/e0742dab64804c69bd292cc3954df6ff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
package main
import (
"crypto/tls"
"crypto/x509"
"fmt"
"io/ioutil"
"net/http"
"testing"
)
var client *http.Client
func init() {
pool := x509.NewCertPool()
caCertPath := "*****改成自己的地址******ca.crt"
caCrt, err := ioutil.ReadFile(caCertPath)
if err != nil {
fmt.Println("ReadFile err:", err)
return
}
pool.AppendCertsFromPEM(caCrt)
clientCrt, err := tls.LoadX509KeyPair("*****改成自己的地址******client.crt", "*****改成自己的地址******client.key")
if err != nil {
fmt.Println("Loadx509keypair err:", err)
return
}
tr := &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: pool,
Certificates: []tls.Certificate{clientCrt},
},
}
client = &http.Client{Transport: tr}
}
func TestOneWayAuthentication(t *testing.T) {
type test struct {
url string
}
tests := map[string]test{
"test1": {url: "https://www.golang-server.cn:8080/svc/hello-openssl"},
"test2": {url: "https://www.golang-server.com:8080/svc/hello-openssl"},
"test3": {url: "https://abc.org.golang-server.com:8080/svc/hello-openssl"},
"test4": {url: "https://www.golang-server.cn:8080/svc/hello-openssl"},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
resp, err := client.Get(tc.url)
if err != nil {
fmt.Println("Get error:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
})
}
}
在/etc/hosts里设置域名,进行测试
![在这里插入图片描述](https://img-blog.csdnimg.cn/15cbe963ff7d4e9b8543dee060cf3ece.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_12,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8c7fac5f3cd848c2ba8f21ade926d573.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/620af9cdd482431289ea9b3ac11c9d35.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_16,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4db1ddef397643ff89c894dabd0de234.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/e2cc321593a647429078c07cdc2c701e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_15,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d7cf826bcfc24554bb97aaf95369452f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/e11e6345bc5845de81253b9055d2f408.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2b606561cafe4953b593139bb508dac9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
最后,点击 左下角红色的Add
![在这里插入图片描述](https://img-blog.csdnimg.cn/0e4745ea60b644f0856632893cef7fb2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_10,color_FFFFFF,t_70,g_se,x_16#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/46a0a77a497b468281a1db13e671ff86.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAZ3JwYy1nb-a6kOeggeWJluaekOS4juWunuaImCDlm77mlofkuJPmoI8=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
下一篇文章
oauth2认证方式介绍