zoukankan      html  css  js  c++  java
  • 2020课程设计(基于gmssl的CA系统构建及应用)

    一、任务详述

    1.了解gmssl中的命令,描述支持的选项、场景和参数,制作成文档;

    2.使用OpenSSL搭建CA,颁发证书、签名验签、模拟用户和颁发机构,查看证书等等;

    3.制作网站,通过https访问。

    二、任务理解

    (一)在Ubuntu虚拟机下安装gmssl,在提示下并理解使用gmssl分工完成文档;

    (二)搭建CA

    搭建CA具体步骤:

    1. 建立根CARoot CA(自己给自己颁发证书)

    1)生成私钥文件

    #(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem  4096)

    2)生成自签名证书 (CA要有证书)

    #openssl  req -new -x509  -key /etc/pki/CA/private/cakey.pem -out/etc/pki/CA/cacert.pem -days 3650

    //req:申请;-x509:自签名

    //查看证书内容  openssl x509 -in cacert.pem -noout  -text

    //图形方式 sz cacert.pem   改后缀crt

    2.用户服务器申请证书,CA服务器颁发证书

    1)生成私钥

    #(umask 077;openssl genrsa -out app.key 1024)

    2)生成证书申请文件

    #openssl  req  -new -key app.key  -out app.csr

    3)将申请文件发给CA

    #scp app.csr 172.21.109.25:/etc/pki/CA

    3.CA颁发证书--用自己的私钥签名

    #touch index.txt   //这个文件会自动更新        

    #echo 0F > serial   //下一个要颁发的证书的编号

    #openssl ca -in app.csr -out certs/app.crt-days 100

    4.证书发送客户端

    #scp certs/app.crt 172.21.111.1:/data

    5.在应用软件中使用证书

    1)做一个加密的网站,自签名证书,首先安装一个模块mod_ssl

    yum install mod_ssl

    安装了这个模块,会生成/etc/httpd/conf.d/ssl.conf这个配置文件

    2)配置这个配置文件

    在/etc/httpd/conf.d/ssl.conf配置文件指定新的证书路径,私钥文件和上级CA证书的证书路径

    vim /etc/httpd/conf.d/ssl.conf

    3)配置完之后然后重新启动http服务

    service httpd restart

    3)ss -ntl 查看有没有443端口

    4)用https来访问网站,安装证书

    (三)制作网站,通过https访问

    自建CA证书

    首先建立myCA目录用于存放自建CA的相关信息:

    cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA

    myCA用于存放 CA 根证书,证书数据库,以及后续服务器生成的证书,密钥以及请求。

    signedcerts保存签名证书的 copy,private包含私钥。

     

    之后配置myCA相关参数,在myCA目录下进行:

     

    echo '01'>serial && touch index.txt

    然后创建 caconfig.cnf 文件(自建CA的配置文件):

     

    vim ~/myCA/caconfig.cnf

    caconfig.cnf文件内容如下:

     

    # My sample caconfig.cnf file.

    #

    # Default configuration to use when one is not provided on the command line.

    #

    [ ca ]

    default_ca      = local_ca

    #

    #

    # Default location of directories and files needed to generate certificates.

    #

    [ local_ca ]

    dir             = /home/<username>/myCA

     

    certificate     = $dir/cacert.pem

    database        = $dir/index.txt

    new_certs_dir   = $dir/signedcerts

    private_key     = $dir/private/cakey.pem

    serial          = $dir/serial

    #       

    #

    # Default expiration and encryption policies for certificates.

    #

    default_crl_days        = 365

    default_days            = 1825

    default_md              = SHA256

    #       

    policy          = local_ca_policy

    x509_extensions = local_ca_extensions

    #       

    #

    # Default policy to use when generating server certificates.  The following

    # fields must be defined in the server certificate.

    #

    [ local_ca_policy ]

    commonName              = supplied

    stateOrProvinceName     = supplied

    countryName             = supplied

    emailAddress            = supplied

    organizationName        = supplied

    organizationalUnitName  = supplied

    #       

    #

    # x509 extensions to use when generating server certificates.

    #

    [ local_ca_extensions ]

    subjectAltName          = DNS:localhost

    basicConstraints        = CA:false

    nsCertType              = server

    #       

    #

    # The default root certificate generation policy.

    #

    [ req ]

    default_bits    = 2048

    default_keyfile = /home/<username>/myCA/private/cakey.pem

     

    default_md      = SHA256

    #       

    prompt                  = no

    distinguished_name      = root_ca_distinguished_name

    x509_extensions         = root_ca_extensions

    #

    #

    # Root Certificate Authority distinguished name.  Change these fields to match

    # your local environment!

    #

    [ root_ca_distinguished_name ]

    commonName              = MyOwn Root Certificate Authority # CA机构名

    stateOrProvinceName     = JS                               # CA所在省份

    countryName             = CN                               # CA所在国家(仅限2个字符)

    emailAddress            = XXXX@XXX.com                     # 邮箱

    organizationName        = XXX                              #

    organizationalUnitName  = XXX                              #

    #       

    [ root_ca_extensions ]

    basicConstraints        = CA:true

    其中dir和default_keyfile的路径需要改成自己的username

     

    生成 CA 根证书和密钥:

     

    export OPENSSL_CONF=~/myCA/caconfig.cnf       #该命令用于给环境变量 OPENSSL_CONF 赋值为caconfig.cnf。

    openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825             # 生成 CA 根证书和密钥

    该步骤需要用户设置一个密码,请牢记。

     

    以上步骤生成了 CA 自签名根证书,和 RSA 公/私密钥对,证书的格式是 PEM,有效期是1825天。

     

    /myCA/cacert.pem: CA 根证书

    /myCA/private/cakey.pem: CA 私钥

     

    生成服务器配置文件exampleserver.cnf:

     

    vim ~/myCA/exampleserver.cnf

    exampleserver.cnf文件内容如下:

     

    #

    # exampleserver.cnf

    #

     

    [ req ]

    prompt             = no

    distinguished_name = server_distinguished_name

     

    [ server_distinguished_name ]

    commonName              = localhost          # 服务器域名

    stateOrProvinceName     = JS                 # 服务器所在省份

    countryName             = CN                 # 服务器所在国家(仅限2个字符)

    emailAddress            = XXXX@XXX.com       # 邮箱

    organizationName        = XXX                #

    organizationalUnitName  = XXX                #

    生成服务器证书和密钥:

    export OPENSSL_CONF=~/myCA/exampleserver.cnf   # 该命令设置环境变量 OPENSSL_CONF,使得 openssl 更换配置文件。

    openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM

    同样的,需要设置密码。

    之后,有2种对临时密钥的操作,选择其一即可:

    1.将临时私钥转换为 unencrypted key,即密钥不加密状态:

    penssl rsa -in tempkey.pem -out server_key.pem

    需要输入密码短语。

     

    2.如果希望将 key 保持为加密状态,直接改名:

    mv tempkey.pem server_key.pem

    两者的区别是,第二种需要在服务器启动时输入私钥的密码,否则会导致服务器启动失败,但第二种安全性高于第一种,可以更好的保护密钥。

     

    使用 CA key 对服务器证书签名:

     

    export OPENSSL_CONF=~/myCA/caconfig.cnf

    openssl ca -in tempreq.pem -out server_crt.pem

    删除临时证书和密钥:

    rm -f tempkey.pem && rm -f tempreq.pem

    现在,自签名的服务器证书和密钥对便产生了:

    server_crt.pem : 服务器证书文件

    server_key.pem : 服务器密钥文件

    以下通过LAMP搭建一个网站进行验证

     

    配置httpd(Apache)

    第一步:安装Apache服务程序(apache服务的软件包名称叫做httpd)

    yum install httpd -y

    第二步: 将Apache服务添加到开机自启中

    systemctl start httpd

    systemctl enable httpd

    第三步:打开浏览器 测试 127.0.0.1,可以看到默认主页

    httpd主要目录:

     

    服务目录:/etc/httpd

    主配置目录:/etc/httpd/conf/httpd.conf

    网站数据目录:/var/www/html

    访问日志:/var/log/httpd/access_log

    错误日志:/var/log/httpd/error_log

     

    配置php

    1、安装源

    安装php需要配置额外的yum源,否则会报错不能找到相关软件包。

    php高版本的yum源地址,有两部分,其中一部分是epel-release,另外一部分来自webtatic,如果跳过epel-release安装webtatic的时候会有错误。

     

    安装需要的命令是:

    rpm -Uvh https://dl.Fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm

    rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

    也可以选择下面的这个命令,是一样的效果:

    yum install epel-release -y

    rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

    2、清除历史版本

    为了防止系统上面发生php冲突,所以,这个命令还是先执行一下更好些:

    yum -y remove php*

    3、安装扩展包

    事实上,这里面的对应扩展库很多,一定要注意的有cli和fpm这两个包,其它的相关包看需要:

    yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-mysql

    由于后面要用MySQL,所以mysql包也是需要的。

     

    配置MySQL

    为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。

    网络环境允许的话直接安装:

    wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

    yum -y install mysql57-community-release-el7-10.noarch.rpm

    yum -y install mysql-community-server

    mysql-community-server较大如果下载很慢,可以到国内镜像源下载:

    http://mirrors.ustc.edu.cn/mysql-ftp/Downloads/

    下载后解压到图中文件目录下:

    注意文件权限,再安装:

     

    yum -y install mysql57-community-release-el7-10.noarch.rpm

    yum -y install mysql-community-server

    mysql有初始默认密码,使用以下命令查找:

    grep "password" /var/log/mysqld.log

    输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库。

    修改密码:

    mysql -uroot -p

    ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

    新密码设置的时候如果设置的过于简单会报错, 原因是因为MySQL有密码设置的规范,具体是与validate_password_policy的值有关,可以先尝试大小写加下划线的长密码。

     

    MySQL完整的初始密码规则查看

    SHOW VARIABLES LIKE 'validate_password%';

    可以通过如下命令修改:

    mysql> set global validate_password.policy=0;

    mysql> set global validate_password.length=1;

    之后可以重新设置简单密码。

     

    配置SSL

    ssl需要以下模块:

    修改ssl.conf:

    cd /etc/httpd/conf.d

    sudo vim ssl.conf 

    修改DocumentRoot到自己的网页目录,并更改证书密钥来源为自建CA:

     

    网页配置

    将需要的网站文件夹复制到/var/www/html/目录下

    修改/etc/httpd/conf/httpd.conf文件中的网站文件名:

    创建自己网站需要的数据库:

    create database myzoo;

    use myzoo;

    create table Person(PersonID int primary key auto_increment, Password varchar(100),Salt varchar(100),Username varchar(100),Token varchar(100),Zoobars int default 10, Profile varchar(5000));

     

    重启httpd查看当前网页:

    setenforce  0

    sudo systemctl restart httpd

    先关闭selinux,不然会报错,服务启动前会验证之前设置的证书密码(网站的那个,不是CA的)。

    目前是普通的http连接,因为并没有将自建CA导入浏览器。

     

    浏览器导入证书

    由于网站的证书是自建CA签名的,浏览器并不信任,所以需要手动导入CA证书。

     

    以chrome为例:设置->高级->隐私设置和安全性->管理证书

    可以查看证书详细信息和导入自建CA证书

    因为之前配置网站证书时设置的域名是localhost,所以需要通过localhost域名进行https连接,不能使用127.0.0.1。

    地址栏访问状态出现一把绿色的锁,成功搭建https。

     

     三、任务分配

    1.我们组共有22条gmssl需要去注解,standard commands 有9条,每人3条,Message Digest commands 有3条,每人1条,Cipher commands有10条,3 3 4分工

    2.CA搭建,分别查找资料,合作对比,得到最佳方案;

    3.网站制作,一人制作合适的网页,两人合作完成CA以及其他环境的配置浏览器导入证书。

     

     四、任务的进度安排

    1.第一周进行小组讨论,完成任务的理解和初步分工

    进行前期资料的搜集,在虚拟机上按照gmssl,基本掌握gmssl的使用方法,和对gmssl命令初步进行注解;

    2.第二周完成gmssl命令的研究,提交研究成果

    对CA搭建进行尝试,完成颁发证书、签名验签等基本功能;

    3.第三周完成OpenSSL搭建的CA,能够模拟用户,查看证书,实现预期功能

    准备好网站制作的电脑环境,使用java或者python完成网站的前期制作,利用web知识美化网页;

    4.第四周进行CA颁发证书,完成ssl、网页和浏览器的配置,达到安全可靠的访问

  • 相关阅读:
    函数(五)——装饰器,递归调用,匿名函数
    函数(四)——装饰器
    函数(三)
    函数(二)
    函数(一)
    python基础(九)
    python基础(八)
    python基础(七)
    javaweb开发 idea ssm开发(二)
    PHP计算两个经纬度地点之间的距离
  • 原文地址:https://www.cnblogs.com/regina1st/p/13836239.html
Copyright © 2011-2022 走看看