use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0

问题:

最近在golang 1.15+版本上,用 gRPC通过TLS实现数据传输加密时,遇到了一个问题:

 

原文:

2021/02/02 16:17:04 Call Route err: rpc error: code = Unavailable desc = connection error: desc = "transport: authentication  field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0"

造成的原因是因为我用的证书,并没有开启SAN扩展(默认是没有开启SAN扩展)所生成的,所以在导致客户端和服务端无法建立连接, 所以我们要根据提示来解决这个问题:

按照提示所示,有2种方案可以解决:

方案一:设置 GODEBUG 为 x509ignoreCN=0

      将go的 环境变量 GODEBUG 为 x509ignoreCN=0,但是我设置了,还是未成功,你们可以自己试下,是否能成功。

方案二:使用开启扩展SAN的证书

   1. 什么是 SAN

SAN(Subject Alternative Name) 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。

   2.如何生成含有SAN的证书

      2.1. 生成CA根证书

          2.1.1 准备ca配置文件,得到ca.conf

vim 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          = Ted CA Test

      2.1.2 生成ca秘钥,得到ca.key                       

openssl genrsa -out ca.key 4096

     2.1.3 生成ca证书签发请求,得到ca.csr

openssl req \
  -new \
  -sha256 \
  -out ca.csr \
  -key ca.key \
  -config ca.conf

  配置文件中已经有默认值了,shell交互时一路回车就行

     2.1.4 生成ca根证书,得到ca.crt

  

openssl x509 \
    -req \
    -days 3650 \
    -in ca.csr \
    -signkey ca.key \
    -out ca.crt

2.2. 生成终端用户证书

   2.2.1 准备配置文件,得到server.conf

     

vim 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          = www.eline.com

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS.1   = www.eline.com
IP      = 192.168.1.100

    2.2.2 生成秘钥,得到server.key

openssl genrsa -out server.key 2048

    2.2.3 生成证书签发请求,得到server.csr     

openssl req \
  -new \
  -sha256 \
  -out server.csr \
  -key server.key \
  -config server.conf

 配置文件中已经有默认值了,shell交互时一路回车就行

2.2.4 用CA证书生成终端用户证书,得到server.crt

openssl x509 \
  -req \
  -days 3650 \
  -CA ca.crt \
  -CAkey ca.key \
  -CAcreateserial \
  -in server.csr \
  -out server.pem\
  -extensions req_ext \
  -extfile server.conf

现在证书已经生成完毕, server.pem 和 server.key正式我们需要的证书和密钥,我们用生成的证书验证一下:

启动服务端:

  

启动成功了,

 

客户端调用:

看到调用成功了。

 

 

 

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值