某些软件的默认行为要求https形式访问,比如harbor,而自己测试用并不需要真的申请一个证书.
一般有两种解决方案:
1. 查找改用http的方案
2.使用自签名证书,即自己给自己颁发一个证书,因为是自己给自己颁发的,只是徒有数字证书的形式,是不会被调用方认可的,所以需要手动在调用方将该证书加入信任列表.
先简述下正常证书生成的流程,方便之后理解:
1.服务器有一份私钥,用于加解密,是一份以".key"结尾的文件,这份文件永远不需要外传,服务器私有.
2.服务器将私钥对应的公钥信息,和其他认证信息打包进一个以".csr"结尾的文件,将此文件发给权威机构CA认证.
3.权威机构审核".csr"申请信息,审核通过后,生成带有权威机构签名的".crt"结尾的证书文件.
4.这份".crt"文件是可以分发出去的,调用者可以去权威机构CA处确认该文件由CA认证过,是合法的,再用".crt"中的公钥对信息加解密,与服务器通讯.
以下是创建流程,我搭建的harbor服务器,所以文件名用的harbor,可以按需自定义:
注: [服务器ip]就是需要被认证的服务器的ip,下面的配置都用[服务器ip]替代,方括号也是要被替换的
示例: [服务器ip] 一律替换成 xxx.xxx.xxx.xxx
1.生成服务器私钥,即".key"结尾文件,此文件完全是服务器私有,同时会生成向CA发起认证请求的".csr"文件,该文件需要提交给CA审核.
openssl req -new -newkey rsa:2048 -nodes -keyout harbor.key -out harbor.csr -subj "/CN=[服务器ip]"
注: 如果是针对域名认证,此处 CN=[服务器ip] 应该替换为 CN=[域名]
2.由于是测试环境,我直接使用ip的形式颁发证书,即被认证的就是ip,而不是域名.
这种ip形式的证书要采用SAN(Subject Alternative Name)形式,
所以需要特殊配置,创建一个配置文件openssl.cnf,下一步生成".crt"证书文件要用到这个配置文件
[ req ]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[ req_distinguished_name ]
C = US
ST = State
L = City
O = Organization
CN = [服务器ip]
[ v3_req ]
subjectAltName = @alt_names
[ alt_names ]
IP.1 = [服务器ip]
3.自己作为CA对认证请求".csr"进行认证,并生成".crt"证书
openssl x509 -req -in harbor.csr -signkey harbor.key -out harbor.crt -days 365 -extfile openssl.cnf -extensions v3_req
执行完成会生成".crt"结尾的证书文件,在需要配置证书的应用进行配置
到目前为止,在服务器上创建的应用可以被https形式访问,但访问者是不信任该证书的,因为这个证书是被自己认证的,而不是权威机构,所以需要手动将证书添加到访问者的信任列表.这里举两个常规示例:
1. 浏览器访问,我是windows系统,将上面生成的".crt"下载到本地,双击执行,一直点击下一步就行,其中一步注意一下,证书存储那项选择
->将所有证书都放入下列存储
->浏览,然后选择受信任的根证书颁发机构
安装完成后,再次打开这个需要https协议访问的ip,就会发现浏览器不再有不安全警告.
2.服务器访问,这个视具体情况,我这个是harbor服务器,需要被docker服务访问,那么就需要将".crt"添加到作为访问者的docker服务的信任列表中.
mkdir -p /etc/docker/certs.d/[服务器ip]
创建该目录,如果是域名形式,[服务器ip]换成域名,在该目录下放置自签名的".crt"证书文件,然后重启docker,再次使用docker login [服务器ip] 就能正常登录.