zoukankan      html  css  js  c++  java
  • 自创建数字证书,安装到浏览器

    一、前言

      最近想为家姐的Coco工作是做个小程序,因为小程序网络请求都必须是https的,这边就涉及获取Ca证书的问题,关于Ca证书相关知识,网络上一大堆,我这边只罗列一下Ca的签发过程。因数字证书基本都是要钱的,虽然有免费的可以申请(有使用期限),但是笔者暂时不打算去申请,我只是现在开发测试使用,所以打算自己生成。生成数字证书的工具有openssl、keytool等,这篇博文主要介绍如何通过jdk自带的keytool创建数字证书,以及在浏览器中安装证书。

    二、正文

         2.1Ca签发过程

    1)服务方 S 向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证(申请证书不需要提供私钥,确保私钥永远只能服务器掌握)
    2)CA 通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等
    3)如信息审核通过,CA 会向申请者签发认证文件-证书。
      证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名
      签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名
    4)客户端 C 向服务器 S 发出请求时,S 返回证书文件
    5)客户端 C 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认  证书的合法性,即公钥合法
    6)客户端然后验证证书相关的域名信息、有效时间等信息
    7)客户端会内置信任 CA 的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA 的证书,证书也会被判定非法

    在这个过程注意几点:
    1)申请证书不需要提供私钥,确保私钥永远只能服务器掌握
    2)证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名
    3)内置 CA 对应的证书称为根证书,颁发者和使用者相同,自己为自己签名(用CA自己的私钥签名),即自签名证书(此证书中的公钥即为CA的公钥,可以使用这个公钥对证书的签名进行校验,无需另外一份证书)
    4)证书=公钥+申请者与颁发者信息+签名

       2.2 https的通信过程

      1)服务端需要认证的通信过程

      

    • 客户端发送请求到服务器端
    • 服务器端返回证书和公开密钥,公开密钥作为证书的一部分而存在
    • 客户端验证证书和公开密钥的有效性,如果有效,则生成共享密钥并使用公开密钥加密发送到服务器端
    • 服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端
    • 客户端使用共享密钥解密数据
    • SSL加密建立………

      2)客户端认证过程

      客户端需要认证的过程跟服务器端需要认证的过程基本相同,并且少了最开始的两步。这种情况都是证书存储在客户端,并且应用场景比较少,一般金融才使用,比如支付宝、银行客户端都需要安装证书

      2.3 keytool的使用

        keytool是JDK自带的密钥和证书管理工具。使用keytool可以生成密钥库(keystore),密钥库中的条目类型只有两种:密钥项和可信任的证书项!

      密钥项- 每项存放极为敏感的加密密钥信息,这种信息以一种受保护的格式储存以防止未授权的访问。通常,储存在这类项中的密钥是机密密钥,或是伴有用于认证相应公钥用的证书“链”的私钥。keytool 和 jarsigner 工具只处理后一类型的项,即私钥及其关联的证书链。

      可信任的证书项 - 每项包含一个属于另一团体的公钥证书。它之所以叫做“可信任的证书”,是因为密钥仓库的拥有者相信证书中的公钥确实属于证书“主体”(拥有者)识别的身份。证书签发人通过对证书签名来保证这点。

      下面来看看keytool都有哪些命令参数(笔者使用的是JDK1.8):

      

      

      

      下面是部分参数的默认值:

      -keysize 1024
      -validity 90
      -alias "mykey"
      -keyalg "DSA"
      -keystore 用户宿主目录中名为“.keystore”的文件keystore 指定keystore -file 需导入的证书

      下面是一些常用命令:

      1)创建证书(两种方式:一种是一步到位,另一种是交互模式)

    //交互式
    keytool -genkeypair -alias coco -keyalg RSA -keysize 1024 -keypass 123456 -validity 365 -keystore d:coco.keystore -storepass 123456

      

    //一步到位
    keytool -genkeypair -alias "coco" -keypass 123456 -keyalg "RSA" -keystore "d:coco.keystore" -storepass 123456 -dname 
    "CN=www.****.com, OU=anything, O=anything, L=anything, ST=anything, C=anything"

      这边对命令稍微解释一下,访问密钥库需要密码,访问密钥库中某个条目也是需要密码,所以在创建密钥库、密钥条目的时候,需要设定这两种密码,创建证书的过程中通过-storepass设定访问密钥库的密码,-keypass设定访问密钥库中访问某个条目的密码。在交互式证书创建过程中,“您的名字和姓氏”填写自己应用的域名,具体域名根据自己实际需求修改,其他信息可以任意填写。还有就是-alias后面的参数值(别名)在密钥库中是不区分大小写的

      2)导出证书

      在上一步的操作中,其实生成了一个公私密钥对,以及一份证书,我们现在将别名为“coco”的数字证书导出来。

      keytool -exportcert -alias coco -file d:coco.crt -keystore d:coco.keystore -storepass 123456

      执行结果:

      

      

      2.4 在浏览器安装生成的证书(我这边只演示在IE10里面安装自己生成的证书)

      入口:工具》Internet 选项》内容》证书》受信任的根证书颁发机构》导入

      

      

      

      

      

      这样我们自己的根证书就安装完成了!如果不安装根证书,那么当我们访问https网站的时候,浏览器就会有类似的安全提示:

      

      2.5 配置tomcat,使https访问生效

      为了使部署在tomcat中的应用可以提供https访问能力,我们需要修改%tomcat_home%/conf/server.xml文件(笔者使用的是apache-tomcat-6.0.44),将下面配置的redirectport改为443:

    <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>

      修改后:

    <Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>

      这个redirectPort的作用是当客户端以http方式访问某个服务端资源,而这个资源又要求必须https访问时,服务器重定向的端口号。这边为什么需要将8443改为443呢?是因为443是https默认的端口,就像80是http默认的端口一样,如果端口设置成443,那么在使用https访问服务器的时候不需要带端口,如果设置成8443,那么必须带端口。

      将下面这行注释去掉,启用SSL,并且将端口从8443改为443,并且加上密钥库路径以及密钥库访问的密码:

    <!--
            <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
                   maxThreads="150" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" />
                   -->

      修改后:

    <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
                   maxThreads="150" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" keystoreFile="d:/coco.keystore" keystorePass="123456"/>

      然而,这样配置会报:

      

      最终改成如下,注意protocol属性值的变化:

    <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
                   maxThreads="150" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" keystoreFile="d:/coco.keystore" keystorePass="123456"/> 

      增加的两个参数,keystoreFile指定“密钥库”,keystorePass指定密钥库的密码。

      现在为了能在访问http的时候自动跳转到https,还需要配置%tomcat_home%/conf/web.xml,将下面这段代码加入到节点:<welcome-file-list />后面:

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>securedapp</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

      如果要取消http自动跳转https,那么将这段删除或者将CONFIDENTIAL改成NONE即可!

      2.6 修改host文件,将证书中的域名定向为127.0.0.1

      为了验证前面所做的工作:浏览器中安装证书之后,使用http(2.5节配置让http自动跳转为https)或者https访问需要https访问的网站,浏览器不会有安全问题提示。笔者的操作系统是Win8,找到:C:WindowsSystem32Driversetchosts,用记事本打开,在最后面添加域名和IP地址的映射

      

      

      2.7 部署应用,验证功能

      笔者随便建了一个工程,打包成war放在%tomcat_home%/webapps/下面,然后通过http访问结果如下(会自动跳转https):

      

      

    三、参考/引用链接(非常感谢原文作者的辛勤劳作)

          Ca签发过程------https://www.cnblogs.com/handsomeBoys/p/6556336.html

        https通信过程------https://blog.csdn.net/wangjun5159/article/details/51510594

        keytool用法------https://blog.csdn.net/wrs1226/article/details/49070681

           Tomcat配置https及访问http自动跳转至https------http://blog.sina.com.cn/s/blog_618592ea01012q40.html

           Tomcat中redirectPort的作用------https://blog.csdn.net/catoop/article/details/79510414

         tomcat设置https端口时,8443和443区别------https://blog.csdn.net/u012012240/article/details/73805158

      服务器设置http自动转跳https------https://blog.csdn.net/qq_30553235/article/details/78895563

      tomcat配置https启动出现"No Certificate file specified or invalid file format"异常------https://blog.csdn.net/hfsu0419/article/details/7536408

      

  • 相关阅读:
    Linux 添加环境变量
    postgresql 获取修改列的值
    5月30日周一上午
    周日5月29日
    2016年5月26日
    如何使用Gson(添加到项目里去)
    linux内核分析课程总结()待完善
    5月5日离散课笔记
    4月28日的离散课(还少了一部分)
    2016年4月29日
  • 原文地址:https://www.cnblogs.com/xdouby/p/9035198.html
Copyright © 2011-2022 走看看