了解HTTPS和数字证书

也许你经过一段时间的了解,已经知道基于数字证书的身份认证方式是符合等级保护条例的双因素认证方式,而且是安全性比较高的认证方式。你决定要使用数字证书来实现业务系统的用户登录,你现在要了解如何使用数字证书实现用服务器认证和户身份认证。

通过实验搭建一个测试CA系统,颁发服务器证书和用户证书,实现用户基于证书登录。

做完实验,你也许会对目前web服务支持的认证策略感到失望。

实验内容:

  1. 搭建Openssl CA环境,签发服务器证书和客户端证书。
  2. nginx,安装nginx,配置HTTPS发布,且被浏览器认证通过。
  3. 设置客户端认证。

搭建CA,并签发证书

步骤如下:

1.生成ROOT CA 的私钥

2.用私钥签发CA的自签根证书

3.配置CA的发布环境,CRL文件、index文件、证书发布目录等

4.签发服务端证书

5.签发客户端证书

下载并安装openssl

# openssl 下载页面 https://www.openssl.org/source/,

cd /home &&

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz

tar xvf openssl-1.1.1g.tar.gz

cd openssl-1.1.1g

./config --prefix=/usr/local/openssl

make && make install

创建pki目录,作为CA系统的目录

mkdir /home/pki

cd /home/pki

mkdir certs private crl

touch index.txt

echo '01' > serial

cp /usr/local/openssl/ssl/openssl.cnf /home/pki

chmod 700 /home/pki/private

#生成 根密钥

openssl genrsa -aes256 -out /home/pki/private/ca_root.key 2048

# 生成root证书请求

openssl req -new -key /home/pki/private/ca_root.key -out /home/pki/ca.csr

# req信息在openssl.cnf 中定义,-conf openssl.cnf,修改当前目录下cnf文件
# 不加-conf系统默认的conf,在拷贝的原文件位置/usr/local/openssl/ssl/openssl.cnf

openssl x509 -req -sha256 -days 3650 -in /home/pki/ca_root.csr -signkey /home/pki/private/ca_root.key -out /home/pki/certs/ca_root.pem

有关ca根的配置,修改当前目录下的openssl.cnf文件。

# 修改openssl.cnf [ CA_default ] 设置ca的证书和私钥

# certificate     = $dir/certs/ca_cert.pem

# private_key     = $dir/private/ca_root.key

# 设置[CA_default]的相关路径,指向当前的路径

openssl.cnf文件用法

openssl的默认参数在openssl.cnf文件中配置。openssl命令行 req/x509/ca三个命令。req、x509 2个命令是用来处理数字证书,ca命令是包含证书的签发和撤销,同步更新index文件和crl文件。前2个命令独立命令,而ca是一个更系统的命令。

req,x509,ca命令都可以用 -config config文件,指明文件路径,设置默认参数,也可以在命令行中显示传递参数。config文件采用[ca][req]的方式,设置相关参数,由[]开始,到下一个[]之间,是这个标签的参数。

生成root证书,采用req命令 使用到config文件[req]段中的配置,x509_extensions = v3_ca扩展项定义basicConstraints=CA:true,基本约束定义了签发CA证书。

在config文件中,定义[usr_cert],采用用户的默认扩展设置。

可以在config中定义[server_cert]服务器证书扩展,也可以采用单独的扩展文件。服务器扩展中定义subject alternative name,服务端通过设置SAN(subject alternative name)的方式,实现将域名或者ip地址写入到证书中。

使用独立的扩展文件,创建并编辑server.extensions.cnf文件。

basicConstraints=CA:FALSE

subjectAltName=@my_subject_alt_names

subjectKeyIdentifier = hash

nsCertType = server

nsComment = "OpenSSL Generated Server Certificate"

authorityKeyIdentifier = keyid,issuer:always

keyUsage = critical, digitalSignature, keyEncipherment

extendedKeyUsage = serverAuth

[ my_subject_alt_names ]

DNS.1 = www.website.com

命令行如下,生成客户端证书,通过-extensions显示覆盖config文件中x509_extensions变量

openssl ca -config openssl.cnf -out certs/server.crt -extfile server.extensions.cnf -in server.csr

生成客户端证书,采用extensions命令行覆盖openssl.cnf定义的[req]段中x509_extension字段。

openssl ca -config openssl.cnf -extensions usr_client -out certs/client.crt  -in client.csr

将客户端证书转换成p12文件

openssl pkcs12 -export -clcerts -in certs/client.crt -inkey private/client.key -out client.p12

生成p12文件时,需要设置口令,这个口令是安装p12时需要的解密口令。口令保护p12文件中的私钥,和私钥的对称加密含义还不太一样,可以继续做实验,完成user证书加密密钥保护,在https认证时的作用。

配置NGINX 服务器

重新编译NGINX,支持https。

cd /usr/local/src &&

tar -zxvf nginx-1.17.6.tar.gz &&

cd nginx-1.17.6 &&

./configure --sbin-path=/usr/local/nginx/nginx \

--conf-path=/usr/local/nginx/nginx.conf \

--pid-path=/usr/local/nginx/nginx.pid \

--with-http_ssl_module \

--with-pcre=/usr/local/src/pcre-8.43 \

--with-zlib=/usr/local/src/zlib-1.2.11 \

--with-openssl=/home/openssl-1.1.1g &&

make &&

make install

设置nginx.conf文件,开启https,并设置客户端认证,客户端认证以root发布的证书  

  # HTTPS server

    #

    server {

        listen       443 ssl;

        server_name  localhost;



        ssl_certificate      /home/pki/server.crt;

        ssl_certificate_key  /home/pki/private/server.key;



        ssl_session_cache    shared:SSL:1m;

        ssl_session_timeout  5m;



        ssl_ciphers  HIGH:!aNULL:!MD5;

        ssl_prefer_server_ciphers  on;



        ssl_client_certificate /home/pki/certs/ca_cert.pem;

        ssl_verify_client on;

        ssl_verify_depth 1;

        location / {

            root   html;

            index  index.html index.htm;

        }

    }

配置好证书,访问服务器时,chrome浏览器会弹出响应的证书。

参考文献一:

  1. HTTPS双向认证指南https://www.jianshu.com/p/2b2d1f511959?utm_campaign=haruki
  2. 编辑 openssl 文件 https://wangbin.io/blog/it/https-ca.html
  3. 自建CA及签发证书 http://www.dp2u.com/2019/linux-openssl-CA-and-Server-Certificate.html
  4. extionsion 文件 https://blog.csdn.net/u011893782/article/details/106227305
  5. 创建中间CA  https://blog.csdn.net/qq405052998/article/details/53168959

参考文献:

1. 使用 openssl 生成证书 https://blog.csdn.net/ljskr/article/details/84570254

2.centos 安装nginx https://www.cnblogs.com/zhizihuakai/p/12055618.html

3. chrome 自定义证书 https://www.dazhuanlan.com/2019/12/07/5deaeed8b1ba2/?__cf_chl_jschl_tk__=b347b45d3758c90ea83b9d1e773ec880fa241d0d-1589641153-0-ATRts0hr1eV8S6r6S3Z6n_QM2S8H9WDta8NBfRTUXE1mhOe3XnfpjHjx9oJtoHG_-d4hICmaBK7LMAuexL4KfY8CyStRnSD1aKCFAIx4_B4oTx73HjZO9JY-JaNxBwkslEVGulJqQNgzoK6vJm7jamfJvOle4rnh_iPRXn-0QJspvt7sX4a2-263n5RcEXw3iBcj2uhHuYpVdpKOjSDQO8D2Z9Y6H5YijBZaf8C-wxNujVMEFBCePvfHdDT1K6A8XWiC59LxJQk5c1EB8Tss30HxeDqLQLIy8leuRIth2o3WIkAz54U4eA6sRVQcHS4Gxg

4. nginx 双向证书 https://serverfault.com/questions/938269/nginx-client-cert-verification-ssl-client-certificate-vs-ssl-trusted-certificat

5.ssl_client_certificate https://blog.51cto.com/tchuairen/1782945

6.php 获得证书CN https://cloud.tencent.com/developer/ask/127591

7. php 获得证书https://blog.51cto.com/gdutcxh/2121507

8.http://nginx.org/en/docs/http/ngx_http_ssl_module.html#var_ssl_client_raw_cert

9.redhead资源文件解决签发ca证书 https://access.redhat.com/solutions/28965

10.github 文章 https://gist.github.com/croxton/ebfb5f3ac143cd86542788f972434c96

11. https://gist.github.com/Soarez/9688998

12.How to install OpenSSL on CentOS RedHat Linux, How to configure OpenSSL on CentOS RedHat Linux http://dev.antoinesolutions.com/openssl

猜你喜欢

转载自blog.csdn.net/u011893782/article/details/106108164