关于go+自建gitlab因证书问题无法go mod问题
0x00 why?
最近在写go的项目,git上有现成的轮子,拿来二次开发一下在它基础上在造就行,没想到go 1.15.6
弃用了X.509
证书。。。。所以导致没有办法go mod
,官方Release Notes
是这样写的
CommonName 默认情况下,当不存在“使用者备用名称”时,将X.509证书上 的字段视为主机名的不推荐使用的旧行为现在被禁用。可以通过将值添加x509ignoreCN=0到GODEBUG 环境变量中来临时重新启用它。
请注意,如果CommonName主机名无效,则无论GODEBUG设置如何,它都将被忽略。无效名称包括那些带有字母,数字,连字符和下划线以外的任何字符的名称,以及带有空标签或结尾点的名称。
0x01 detail
x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
x509: certificate signed by unknown authority)
SSL certificate problem: unable to get local issuer certificate
0x02 solve
想解决这个问题,有两种方法,一种是直接把轮子嵌套进去,另一种就是解决证书问题,好在gitlab
咱们自己可以维护,前者工作量太大了, 我们只能硬着头皮解决证书问题。
- 安装openssl
- 如果你已经安装完openssl,需要拷贝openssl证书到/home下
sudo cp /etc/pki/tls/openssl.cnf /home
- 编辑
openssl.cnf
取消req_extensions = v3_req 的注释,如下:
####################################################################
[ req ]
default_bits = 2048
default_md = sha256
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
#x509_extensions = v3_ca # The extentions to add to the self signed cert 取消这一行的注释
# Passwords for private keys if not present they will be prompted for
# input_password = secret
# output_password = secret
- 编辑
[ v3_req ]
模块与下面相同
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
IP = xx.xx.xx.xx
- 生成
SANs
证书
openssl req -new -sha256 -key server.key \
-subj "/C=CN/ST=Beijing/L=Beijing/O=xxTech/OU=xxx/CN=xx.xx.xx.xx" \
-reqexts SAN -config openssl.cnf \
<(printf "[SAN]\nsubjectAltName=IP:xx.xx.xx.xx")) \
-out server.csr
openssl x509 -req -days 365000 \
-in server.csr -CA server.crt -CAkey server.key -CAcreateserial \
-extfile <(printf "subjectAltName=IP:xx.xx.xx.xx") \
-out server.crt
里边的参数带xx
的需要你改
- 配置gitlab为ssl,编辑配置文件为如下:
vim /etc/gitlab/gitlab.rb
... ...
external_url 'https://xx.xx.xx.xx'
nginx['redirect_http_to_https'] =true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/server.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/server.key"
... ...
- 将刚刚生成的
server.crt
和server.key
移动到gitlab配置里
sudo mv server.* /etc/gitlab/ssl/
- 配置生效
gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
- 第一个问题就解决完了,第二个问题,将生成的证书
server.crt
安装到你自己的电脑上
sudo cp server.crt /etc/ssl/certs
sudo trust extract-compat
- 第三个问题,全局关闭git的ssl认证
git config --global http.sslVerify false
此时你再去go run就不会出现错误了,可以愉快的使用go+自建gitlab
了