openssh自签名ca认证
OpenSSL是一个健壮的、商业级的、功能齐全的开源(遵循 Apache 2.0 协议)工具包,用于传输层安全(TLS)和安全套接字层(SSL)协议,实现安全通信、避免窃听、确认另一端连接者身份的功能。它也是一个通用密码库。
OpenSSL 一个C语言函数库,是对SSL协议的实现。
openssl 中也有个叫做 openssl 的工具,是 openssl 中的库的命令行接口。
OpenSSH 是对SSH协议的实现。
openssh依赖于openssl,没有openssl的话openssh就编译不过去,也运行不了。
目录
1.OpenSSL 制作自签名证书
1.1.第一阶段:制作 CA 根证书
1.2.第二阶段:制作服务器证书
1.3.第三阶段:制作客户端证书(双向认证使用)
2.Web 容器配置 HTTPS站点
2.1.Tomcat 配置方案
2.2.Nginx 配置方案
2.3.Apache Httpd 配置方案
3.客户端访问
3.1.安装 CA 机构证书
3.2.安装客户端 PKCS12 证书(双向认证使用)
4、HTTPS 和 SSL 的概念和工作原理
1.OpenSSL 制作自签名证书
1、安装 OpenSSL 。
$ sudo dnf install openssl
2、创建 SSL 工作目录。
证书包括 CA 认证机构、服务器和客户端三类证书的制作,在 SSL 工作根目录下分别建立"ca"、"server"、"client"子目录存放对应的输出文件,并设置所有者为证书管理账户。
$ sudo mkdir -p /data/ssl/ca $ sudo mkdir -p /data/ssl/server $ sudo mkdir -p /data/ssl/client $ sudo chown -R centos:centos /data/ssl
3、术语说明
1.1.第一阶段:制作 CA 根证书
1、制作 CA【秘钥】。
操作过程:设置 CA 秘钥口令。
$ openssl genrsa -des3 -out /data/ssl/ca/ca.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ................................+++++ ............+++++ e is 65537 (0x010001) Enter pass phrase for /data/ssl/ca/ca.key: Verifying - Enter pass phrase for /data/ssl/ca/ca.key:
- 【openssl genrsa】表示制作秘钥。
- 【-des3】表示加密秘钥使用的算法;
- 【-out】表示秘钥的输出文件;
- 【2048】表示秘钥的密码强度。
查看 CA 秘钥文件(需要输入秘钥口令):
openssl rsa -in /data/ssl/ca/ca.key Enter pass phrase for /data/ssl/ca/ca.key: ......
2、制作 CA 【根证书签名申请】
输入 CA 秘钥文件,输出 CA 根证书签名申请文件。
操作过程:验证 CA 秘钥口令 => 设置国家名称 => 设置省份名称 => 设置城市名称 => 设置组织机构名称 => 设置组织单元名称 => 设置证书名称 => 设置电子邮件地址和扩展属性(密码提示信息和可选的公司名称)。
$ openssl req -new -key /data/ssl/ca/ca.key -out /data/ssl/ca/ca.csr Enter pass phrase for /data/ssl/ca/ca.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:cn State or Province Name (full name) []:sd Locality Name (eg, city) [Default City]:qd Organization Name (eg, company) [Default Company Ltd]:private Organizational Unit Name (eg, section) []:zhangyi Common Name (eg, your name or your server's hostname) []:ca Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
- 【openssl req】表示制作证书签名申请。
- 【-new】表示生成证书请求文件;
- 【-key】表示秘钥的输入文件;
- 【-out】表示证书签名申请的输出文件。
- 【Common Name】应为 CA 机构的名称。
查看 CA 证书申请文件:
$ openssl req -in /data/ssl/ca/ca.csr -noout -text
3、生成 CA 自签名【根证书】,即对签名申请进行自签名生成证书。
输入 CA 秘钥文件、CA 根证书签名申请,输出 CA 自签名根证书文件。
操作过程:验证 CA 秘钥口令。
$ openssl x509 -req -days 3650 -signkey /data/ssl/ca/ca.key -in /data/ssl/ca/ca.csr -out /data/ssl/ca/ca.pem Signature ok subject=C = cn, ST = sd, L = qd, O = private, OU = zhangyi, CN = ca Getting Private key Enter pass phrase for /data/ssl/ca/ca.key:
- 【openssl x509】表示制作自签名证书。
- 【-req】表示输入文件的类型是证书签名申请;
- 【-days】表示证书的有效期,单位是天;
- 【-signkey】表示签名秘钥的输入文件;
- 【-in】表示证书签名申请的输入文件;
- 【-out】表示证书的输出文件。
查看 CA 证书文件:
$ openssl x509 -in /data/ssl/ca/ca.pem -noout -text
4、导出 CA【 PKCS12 证书】。
输入 CA 自签的 CA 证书文件、CA 秘钥,输出 CA PKCS12 证书。
操作过程:设置 PKCS12 证书口令。
$ gmssl pkcs12 -export -in /data/ssl/ca/ca.pem -inkey /data/ssl/ca/ca.key -out /data/ssl/ca/ca.p12 -name ca Enter Export Password: Verifying - Enter Export Password:
- 【openssl pkcs12】表示制作 PKCS12 证书。
- 【-export 】表示导出 PKCS12 证书;
- 【-in】表示签名证书的输入文件;
- 【-inkey】表示秘钥的输入文件;
- 【-name】表示 PKCS12 证书的别名;
- 【-out】表示 PKCS12 证书的输出文件。
查看 CA PKCS12 证书文件(需要输入 CA PKCS12 证书口令):
$ gmssl pkcs12 -in /data/ssl/ca/ca.p12 -info Enter Import Password: ...... Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ......
5、查看 CA 产生的全部文件。
$ ls /data/ssl/ca/ ca.csr ca.key ca.p12 ca.pem
1.2.第二阶段:制作服务器证书
1、制作服务器【秘钥】。
操作过程:设置服务器秘钥口令。
$ openssl genrsa -des3 -out /data/ssl/server/server.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) .......................................................+++++ ...........+++++ e is 65537 (0x010001) Enter pass phrase for /data/ssl/server/server.key: Verifying - Enter pass phrase for /data/ssl/server/server.key:
- 【openssl genrsa】表示制作秘钥。
- 【-des3】表示加密秘钥使用的算法;
- 【-out】表示秘钥的输出文件;
- 【2048】表示秘钥的密码强度。
查看服务器秘钥文件(需要输入秘钥口令):
openssl rsa -in /data/ssl/server/server.key Enter pass phrase for /data/ssl/server/server.key: ......
2、制作服务器【证书签名申请】。
输入服务器秘钥文件,输出服务器证书签名申请文件。
操作过程:验证服务器秘钥口令 => 设置国家名称 => 设置省份名称 => 设置城市名称 => 设置组织机构名称 => 设置组织单元名称 => 设置证书名称 => 设置电子邮件地址和扩展属性(密码提示信息和可选的公司名称)。
$ openssl req -new -key /data/ssl/server/server.key -out /data/ssl/server/server.csr Enter pass phrase for /data/ssl/server/server.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:cn State or Province Name (full name) []:sd Locality Name (eg, city) [Default City]:qd Organization Name (eg, company) [Default Company Ltd]:private Organizational Unit Name (eg, section) []:zhangyi Common Name (eg, your name or your server's hostname) []:192.168.216.128 Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
- 【openssl req】表示制作证书签名申请。
- 【-new】表示生成证书请求文件;
- 【-key】表示秘钥的输入文件;
- 【-out】表示证书签名申请的输出文件。
-
注意:【Common Name】应为服务器的 IP 地址或者 DNS(如:192.168.216.128 或者 localhost)。在 在 Web 容器配置后,当客户端使用 HTTPS 协议访问时,如果域名与【Common Name】不一致,则会进行风险提示。
查看服务器证书申请文件:
$ openssl req -in /data/ssl/server/server.csr -noout -text
3、生成 CA 签名的服务器【证书】,即 CA 对服务器签名申请进行签名生成服务器证书。
输入 CA 根证书文件、 CA 秘钥文件、服务器证书签名申请,输出 CA 签名的服务器证书文件。
操作过程:验证 CA 秘钥口令。
$ openssl x509 -req -days 3650 -CA /data/ssl/ca/ca.pem -CAkey /data/ssl/ca/ca.key -CAcreateserial -in /data/ssl/server/server.csr -out /data/ssl/server/server.pem Signature ok subject=C = cn, ST = sd, L = qd, O = private, OU = zhangyi, CN = 192.168.216.128 Getting CA Private Key Enter pass phrase for /data/ssl/ca/ca.key:
- 【openssl x509】表示制作 CA 签名的证书。
- 【-req】表示输入文件的类型是证书签名申请;
- 【-days】表示证书的有效期,单位是天;
- 【-CA】表示 CA 根证书的输入文件;
- 【-CAkey】表示 CA 秘钥的输入文件;
- 【-CAcreateserial】表示如果 CA 序列号文件不存在自动创建;
- 【-in】表示证书签名申请的输入文件;
- 【-out】表示证书的输出文件。
查看服务器证书文件:
$ openssl x509 -in /data/ssl/server/server.pem -noout -text
4、导出服务器【 PKCS12 证书】。
输入 CA 签名的服务器证书文件,输出服务器 PKCS12 证书。
操作过程:验证服务器秘钥口令 => 设置 PKCS12 证书口令。
$ openssl pkcs12 -export -in /data/ssl/server/server.pem -inkey /data/ssl/server/server.key -out /data/ssl/server/server.p12 -name https_cert Enter pass phrase for /data/ssl/server/server.key: Enter Export Password: Verifying - Enter Export Password:
- openssl pkcs12】表示制作 PKCS12 证书。
- 【-export 】表示导出 PKCS12 证书;
- 【-in】表示签名证书的输入文件;
- 【-inkey】表示秘钥的输入文件;
- 【-name】表示 PKCS12 证书的别名;
- 【-out】表示 PKCS12 证书的输出文件。
查看服务器 PKCS12 证书文件(需要输入服务器 PKCS12 证书口令):
$ openssl pkcs12 -in /data/ssl/server/server.p12 -info Enter Import Password: ...... Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
5、查看服务器产生的全部文件。
5、查看服务器产生的全部文件。
1.3.第三阶段:制作客户端证书(双向认证时使用)
1、制作客户端【秘钥】。
操作过程:设置客户端秘钥口令。
$ openssl genrsa -des3 -out /data/ssl/client/client.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) .........+++++ ..........+++++ e is 65537 (0x010001) Enter pass phrase for /data/ssl/client/client.key: Verifying - Enter pass phrase for /data/ssl/client/client.key:
- 【openssl genrsa】表示制作秘钥。
- 【-des3】表示加密秘钥使用的算法;
- 【-out】表示秘钥的输出文件;
- 【2048】表示秘钥的密码强度。
查看客户端秘钥文件(需要输入秘钥口令)
openssl rsa -in /data/ssl/client/client.key Enter pass phrase for /data/ssl/client/client.key: ......
2、制作客户端【证书签名申请】。
输入客户端秘钥文件,输出客户端证书签名申请文件。
操作过程:验证客户端秘钥口令 => 设置国家名称 => 设置省份名称 => 设置城市名称 => 设置组织机构名称 => 设置组织单元名称 => 设置证书名称 => 设置电子邮件地址和扩展属性(密码提示信息和可选的公司名称)。
$ openssl req -new -key /data/ssl/client/client.key -out /data/ssl/client/client.csr nter pass phrase for /data/ssl/client/client.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:cn State or Province Name (full name) []:sd Locality Name (eg, city) [Default City]:qd Organization Name (eg, company) [Default Company Ltd]:private Organizational Unit Name (eg, section) []:zhangyi Common Name (eg, your name or your server's hostname) []:https_client Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
- 【openssl req】表示制作证书签名申请。
- 【-new】表示生成证书请求文件;
- 【-key】表示秘钥的输入文件;
- 【-out】表示证书签名申请的输出文件。
- 【Common Name】应为客户端的统一标识。
查看客户端证书申请文件:
$ openssl req -in /data/ssl/client/client.csr -noout -text
3、生成 CA 签名的客户端【证书】,即 CA 对客户端签名申请进行签名生成客户端证书。
输入 CA 根证书文件、 CA 秘钥文件、客户端证书签名申请,输出 CA 签名的客户端证书文件。
操作过程:验证 CA 秘钥口令。
$ openssl x509 -req -days 3650 -CA /data/ssl/ca/ca.pem -CAkey /data/ssl/ca/ca.key -CAcreateserial -in /data/ssl/client/client.csr -out /data/ssl/client/client.pem Signature ok subject=C = cn, ST = sd, L = qd, O = private, OU = zhangyi, CN = https_client Getting CA Private Key Enter pass phrase for /data/ssl/ca/ca.key:
- 【openssl x509】表示制作 CA 签名的证书。
- 【-req】表示输入文件的类型是证书签名申请;
- 【-days】表示证书的有效期,单位是天;
- 【-CA】表示 CA 根证书的输入文件;
- 【-CAkey】表示 CA 秘钥的输入文件;
- 【-CAcreateserial】表示如果 CA 序列号文件不存在自动创建;
- 【-in】表示证书签名申请的输入文件;
- 【-out】表示证书的输出文件。
查看客户端证书文件:
$ openssl x509 -in /data/ssl/client/client.pem -noout -text
4、导出客户端【 PKCS12 证书】。
输入 CA 签名的客户端证书文件,输出客户端 PKCS12 证书。
操作过程:验证客户端秘钥口令 => 设置 PKCS12 证书口令。
$ openssl pkcs12 -export -in /data/ssl/client/client.pem -inkey /data/ssl/client/client.key -out /data/ssl/client/client.p12 -name https_client Enter pass phrase for /data/ssl/client/client.key: Enter Export Password: Verifying - Enter Export Password:
- 【openssl pkcs12】表示制作 PKCS12 证书。
- 【-export 】表示导出 PKCS12 证书;
- 【-in】表示签名证书的输入文件;
- 【-inkey】表示秘钥的输入文件;
- 【-name】表示 PKCS12 证书的别名;
- 【-out】表示 PKCS12 证书的输出文件。
查看客户端 PKCS12 证书文件(需要输入客户端 PKCS12 证书口令):
$ openssl pkcs12 -in /data/ssl/client/client.p12 -info Enter Import Password: ...... Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ......
5、查看客户端产生的全部文件。
$ ls /data/ssl/client client.pem client.csr client.key client.p12
2.Web 容器配置 HTTPS 站点
2.1.Tomcat 配置方案
1、安装并配置 Tomcat 。
$ sudo tar zxvf apache-tomcat-9.0.34.tar.gz -C /usr/local $ sudo mv /usr/local/apache-tomcat-9.0.34 /usr/local/tomcat-9.0.34 $ sudo gedit /usr/local/tomcat-9.0.34/conf/server.xml
在文件中的增加以下配置并保存(服务器认证):
<Server> <Service> <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" keystoreFile="/data/ssl/server/server.p12" keystoreType="PKCS12" keystorePass="123456a?"> </Connector> </Service> </Server>
在文件中的增加以下配置并保存(双向认证):
<Server> <Service> <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" keystoreFile="/data/ssl/server/server.p12" keystoreType="PKCS12" clientAuth="true" truststoreFile="/data/ssl/ca/ca.p12" truststoreType="PKCS12" truststorePass="123456a?"> </Connector> </Service> </Server>
2、启动/重新启动 Tomcat 。
$ sudo /usr/local/tomcat-9.0.34/bin/startup.sh
$ sudo /usr/local/tomcat-9.0.34/bin/shutdown.sh && /usr/local/tomcat-9.0.34/bin/startup.sh
2.2.Nginx 配置方案
1、安装并配置 Nginx 。
$ sudo dnf install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel $ tar -zxvf nginx-1.18.0.tar.gz $ cd nginx-1.18.0 [centos@host nginx-1.18.0]$ ./configure --with-http_ssl_module [centos@proxy-1 nginx-1.18.0]$ make [centos@proxy-1 nginx-1.18.0]$ sudo make install $ sudo gedit /usr/local/nginx/conf/nginx.conf
在文件中的增加以下配置并保存:
http { server { listen 80; listen 443 ssl; server_name localhost; # 服务器签名证书文件 ssl_certificate /data/ssl/server/server.pem; # 服务器秘钥文件 ssl_certificate_key /data/ssl/server/server.key; # 开启客户端证书认证(双向认证) # ssl_verify_client on; # CA 证书(双向认证) # ssl_client_certificate /data/ssl/ca/ca.pem; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { ... } } }
2、启动/重新启动 Nginx 服务器。
$ sudo /usr/local/nginx/sbin/nginx
$ sudo /usr/local/nginx/sbin/nginx -s reload
2.3.Apache Httpd 配置方案
1、安装并配置 Apache Httpd。
$ sudo dnf install httpd $ sudo dnf install mod_ssl openssl $ sudo setenforce 0 $sudo gedit /etc/httpd/conf.d/ssl.conf
在文件中的编辑以下配置并保存:
# 监听端口 Listen 443 https # Https 根路径 DocumentRoot "/var/www/html" # 服务器域名 ServerName localhost # 服务器签名证书文件 SSLCertificateFile /data/ssl/server/server.pem # 服务器秘钥文件 SSLCertificateKeyFile /data/ssl/server/server.key # 开启客户端证书认证(双向认证) # SSLVerifyClient require # CA 证书(双向认证) # SSLCACertificateFile /data/ssl/ca/ca.pem
2、启动/重新启动 Apache Httpd 服务器。
$ sudo systemctl start httpd.service
3.客户端配置
3.1.安装 CA 机构证书
第一步
第二步
第三步
第四步
第五步
3.2.安装客户端 PKCS12 证书(双向认证使用)
1、参照章节"3.1.安装 CA 机构证书",安装 CA 机构证书。
2、安装客户端 PKCS12 证书。
4、SSL 和 HTTPS 的概念和工作原理
1、SSL 协议
SSL(Secure Sockets Layer 安全套接字协议)是为网络通信提供安全及数据完整性的一种安全协议。SSL 在传输层与应用层之间对网络连接进行加密。
SSL协议本身可以分为两层:
- 底层为SSL记录协议(SSL record protocol);
- 上层为SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)。
1)SSL握手协议:是SSL协议非常重要的组成部分,用来协商通信过程中使用的加密套件(对称加密算法、密钥交换算法和MAC算法等)、在服务器和客户端之间安全地交换密钥,实现服务器和客户端的身份验证。客户端和服务器通过握手协议建立一个会话。会话包含一组参数,主要有会话ID、对方的证书、加密套件(包括密钥交换算法、数据加密算法和MAC算法)及主密钥。
2)SSL密码变化协议:客户端和服务器端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。
3)SSL警告协议:用来允许一方向另一方报告告警信息。消息中包含告警的严重级别和描述。
4)SSL记录协议:主要负责对上层的数据进行分块、计算并添加MAC、加密,最后把记录块传输给对方。
2、HTTPS 协议
HTTPS 是超文本传输安全协议是一种网络安全传输协议。常见的HTTP 协议采用明文传输数据,隐私信息安全性较差;而 HTTPS 协议利用 SSL 来加密数据包,提供对网络服务器的身份认证,能够保护传输的隐私信息,提高数据安全性和完整性。
HTTPS协议和HTTP协议的主要区别:
- HTTPS 需要向 CA 认证机构申请证书。
- HTTPS 是 HTTP+SSL 组成的加密传输、身份认证的网络协议, 比 HTTP 根据安全。
- HTTP 是明文传输协议,HTTPS 则是具有安全性的 SSL 加密传输协议。
- HTTP 和 HTTPS 使用的是完全不同的连接方式,默认的服务端口也不同,HTTP 使用 80 端口,HTTPS 则使用 443 端口。
3、SSL 证书
HTTPS 的核心设计是在数据传输之前的握手,握手过程中确定了数据 非对称加密算法 的密码。在握手过程中网站会向浏览器发送 SSL 证书,SSL 证书是一个支持 HTTPS 网站的身份证明,SSL 证书里面包含了网站的域名,证书有效期,证书的颁发机构以及用于加密传输密码的公钥等信息。
非对称加密算法:非对称加密算法需要两个密钥:公开密钥(PublicKey:简称公钥)和私有密钥(PrivateKey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。
由于公钥加密的密码只能被在申请证书时生成的私钥解密,因此浏览器在生成密码之前需要先核对当前访问的域名与证书上绑定的域名是否一致,同时还要对证书的颁发机构进行验证,如果验证失败浏览器会给出证书错误的提示。
SSL 证书的文件格式遵循 X.509标准,是一种PKI(Public Key Infrastructure,公钥基础结构)证书,主要负责负责传输公钥。
4、HTTPS 的工作原理
HTTPS 在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。握手过程的具体描述如下:
1)浏览器将自己支持的一套加密规则发送给网站。
2)网站从中选出一组加密算法与 HASH 值算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3)浏览器获得网站证书之后浏览器要做以下工作:
① 验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
② 如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
③ 使用约定好的 HASH 值算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4)网站接收浏览器发来的数据之后要做以下的操作:
① 使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
② 使用密码加密一段握手消息,发送给浏览器。
5)浏览器解密并计算握手消息的 HASH 值,如果与服务端发来的 HASH 值一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
HTTPS对应的通信时序图如下:
浏览器与网站互相发送加密的握手消息并验证,目的是为了保证双方都获得了一致的密码,并且可以正常的加密解密数据,为后续真正数据的传输做一次测试。HTTPS 常用的加密算法包括:
- 非对称加密算法:RSA,DSA/DSS
- 对称加密算法:AES,RC4,3DES
- HASH 算法:MD5,SHA1,SHA256