OpenSSL创建HTTPS的证书认证

一、HTTPS的证书

        HTTPS是HTTP+TLS结合的产物。

        HTTPS利用TLS可以完成:

                ①身份认证(防止冒充身份)

                ②加密数据(防止监听到数据)

                ③保证信息的完整性(防止信息的篡改)

        而HTTPS的证书(certification)就是完成身份认证功能,防止他人冒充你。

二、HTTPS证书的作用

        HTTPS证书的作用是用来证明服务器的身份。总不能我说是谁就是谁把。得有一个东西证明我是谁。从而HTTPS证书就出现了。 就和现实世界一样,需要一个东西证明你是谁,而我们的身份证就是证明我们是谁的工具。

       我们可以将HTTPS的证书看成是我们每一个人的身份证。身份证就是为了证明我们的身份而来的。证书就是证明我们访问的服务器是谁一样。

        其实互联网世界和现实世界有点相似的。在现实世界中,我们不可能信任每一人,但是我们可以信任以一少部分人:例如父母、安全局等等。由于我们信任公安局,而公安局会为他们信任的每一个人发送一个身份证,来证明他们是谁。从而当我们拿着公安局发送的身份证的时候,就知道对方是谁了。因为我们信任公安局,而公安局告诉我们对方是谁,从而我们确定他是谁。

        互联网也是一样的,在这个公开访问的互联网中,浏览器不可能信任每一个服务器。但是浏览器可以信任几个证书机构(CA)(相当于:公安局)。浏览器信任证书机构CA,而证书机构CA会为他们信任的服务器发送一个证书,证明服务器是谁。从而当浏览器拿到他们信任的CA签发的证书的时候,就知道访问的服务器是谁了。从而进行身份认证,看看这个服务器是不是我们要访问的服务器,防止是一个钓鱼网址。

        简单来说:证书就是用来证明你是谁的东西。

        

三、证书包含的内容

        上面说证书是为了身份的认证,就和我们的身份证是一样的。里面就会包含一些服务器的一些基本信息。一般会包含以下内容:

        ①所有者(服务器)的信息:国家、地方、名称、最重要的就是域名信息(DNS)

        ②所有者(服务器)的公钥:相当于我们的身份证号。用于加密信息使用。

        ③证书的有效期:和我们身份证一样,有一定的有效期

        ④证书的签发机构:和我们的公安局一样,用来发放身份证。

        下面两个图将说明CSDN证书更多细节:

四、证书的认证过程

    4.1 现实世界的认证过程

         通过一个例子说明证书的认证过程:旅客入住酒店

         旅客信任公安局,酒店也信任公安局。当旅客想入住酒店时,旅客必须证明他是谁。所以旅客向公安局申请的一个身份证来证明他是谁。

        ①酒店首先会让旅客出示身份证,来看看你是谁。

        ②会核对你出示的身份证。因为不是所有身份证都是由公安局签发的,可能是假冒的身份证。该身份证不要是一个伪造的身份证。即看看身份证的签发机构是不是公安局。是不是由信任的人签发的。

        ③看看身份证是不是过期。

        ④看看身份证是否和本人一致。不要拿着他人的身份证入住酒店

        ⑤当第二步到第四步都通过的时候,酒店就知道旅客是谁了。

   4.2 互联网的认证过程

        当我们访问一个www.baidu.com的时候。如何证明我们正在访问的是百度的网址,而不是一个钓鱼的百度网站呢。

        先说明一下对应关系:

                浏览器      ====>        酒店     (浏览器让服务器出示证书)

                服务器      ====>        旅客

                CA            ====>        公安局

        首先浏览器有一份信任的证书机构CA列表,其中公安局算是一个CA。浏览器有一个信任CA列表。

        服务器想要使用HTTPS访问时,必须证明服务器是谁,所以服务器必须向受信任的CA列表中的一个CA进行证书的申请,来证明他们是谁。由这些受信任的CA签发一个证书。

        ①当访问www.baidu.com服务器的时候,浏览器首先让服务器出示一下证书,来看看你是谁。

        ②会对证书进行验证,不是所有的证书都是由信任的CA签发的。即看看证书是不是由受信任的CA列表中的任何一个签发的,如果有一个,则表示是有效的证书,如果一个也没有,则证书不是一个有效的证书。

        ③看看证书是不是在有效期内

        ④看看证书内的主题备用名称和我们访问的服务器是不是同一个地址,防止那其他服务器的证书通过验证。即对比是不是本人。

        ⑤当第二步到第四步都通过的时候,浏览器知道服务器是谁了。

   4.3 注意事项

        不要在电脑或者手机上随便的安装根证书。一个根证书可以理解为一个证书机构CA。当安装一个根证书之后,就表示我们信任这个证书机构CA。就会在受信任的CA列表中加入这个CA。那么由这个根证书签发的所有证书都将会收到信任。因为我们信任了这个根证书,相当于在我们信任关系中加入一个另一个信任的人。

        举一个例子:

        ①假设我们在PC端安装一个钓鱼网站发送的一个根证书crt。安装之后则表示我们已经信任这个根证书代表的CA。

        ②接着攻击者入侵了你们的DNS服务器,又或者修改了hosts的配置文件,将www.baidu.com改成指向他们的IP地址。因为所有的域名都会先经过DNS服务器,获取到要访问的服务器的IP地址。

        ③当浏览器访问https://www.baidu.com时,浏览器会向攻击者指定的服务器请求出示证书,服务器出示一张由第一步安装的根证书签发的证书,并返回客户端。

        ④然后客户端进行4.2小节中的第二步到第四步,来认证发送过来的证书。因为PC端安装了攻击者发送的根证书,所以在受信任的CA列表中就有了这个根证书。所以这是三个步骤将都能通过,浏览器认为你正在访问是真正的https://www.baidu.com。

        ⑤但你在伪造的https://www.baidu.com输入任何隐私信息时,都将发送到攻击者指定的服务器中。

五、利用OpenSSL安装证书

        证书是用来证明服务器的身份的,而证书是由证书机构CA签发的。

        由正规的CA签发的证书,是不需要安装的,因为浏览器内置了一些受信任的CA列表。但是需要收钱的

        而由自己签发的根证书,是不收钱的。但是需要手动进行安装。不然浏览器默认不会信任自己签发的根证书。

        下面看看如何使用OpenSSL创建一个证书

        5.1 创建一个证书机构CA即根证书

                通过第4.2节的介绍,首先需要服务器向证书机构CA申请一个证书,所以我们需要创建一个证书机构CA。来为服务器签发一个证书,并将创建证书机构CA安装到PC上。

                ①创建RSA秘钥:

                        openssl genrsa -out MXCA.key 2048

                ②利用RSA创建一个自签名的根证书

                        openssl req -x509 -new -key MXCA.key -days 3560 -out MXCA.pem                                  ③双击MXCA.pem,进行安装根证书,common Name就是显示的名称。倒数第二项

        

        5.2 使用CA为服务器创建浏览器需要的证书

                已经创建了一个根证书机构(CA),并且也进行了安装以及信任。然后就是使用CA为服务器创建一个证书。首选需要服务器向CA提交一个证书申请文件CSR。证书申请文件中包含服务的基本信息,公钥等信息

                ①首先创建服务器的工私钥并创建一个证书申请文件csr

                         openssl req -newkey rsa:2048 -out server.csr -keyout server.key               

                  ②创建服务器的扩展信息,例如域名等等信息(重要,不然浏览器会出现不安全的字样),保存为server.ext文件

basicConstraints=CA:FALSE
keyUsage=digitalSignature, keyEncipherment, dataEncipherment
extendedKeyUsage=serverAuth, clientAuth
subjectAltName=@MXDNSName
[ MXDNSName ]
DNS.1=www.baidu.com
DNS.2=*.mx.com

                ③签发证书

                        openssl x509 -req -in server.csr -CA MXCA.pem -CAkey MXCA.key -CAcreateserial -days 356 -out server.crt -sha256 -extfile server.ext

                到此证书就创建完成了。

六、附加

                在JAVA程序中需要使用p12证书,我们可以使用crt转化为p12证书,在Java程序中使用

                       openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12              

                 最后我们在Java程序中加入:

server.ssl.key-store=classpath:server.p12
server.ssl.key-store-password=qazw
server.ssl.keyStoreType=PKCS12

                就可以在https进行访问了,但是这时就不法使用HTTP进行请求了。如果想HTTP和HTTPs都有的话,则使用:

    @Bean
    public TomcatServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(httpConnector());
        return tomcat;
    }

//    @Bean
    public Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        //Connector监听的http的端口号
        connector.setPort(8883);
        connector.setSecure(true);
        //监听到http的端口号后转向到的https的端口号
        connector.setRedirectPort(8882);
        return connector;
    }

如果在Nginx上进行HTTPS请求:

server {
    listen 443;
    ssl on;
    #ssl证书的pem文件路径
    ssl_certificate  /root/card/huiblog.top.pem;
    #ssl证书的key文件路径
    ssl_certificate_key /root/card/huiblog.top.key;
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最简单的方法,直接用java里的keytool工具生成一个keystore文件,然后直接用这个文件启用https就可以了。 方法如下: 命令行执行%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA 执行过程中会询问你一些信息,比如国家代码,省市等,其中需要填写两个密码,一次在开头,一次在最后,请保持两个密码相同。比如,我将密码都设成s3cret。 如果不同,启动会报错,大概是下面这样的 java.io.IOException: Cannot recover key 执行完成后会生成一个.keystore文件,将它复制到tomcat的bin目录下(并不一定,放哪里都可以) 打开conf目录下的server.xml文件,找到以下这一段 它被注释掉了,将注释去掉,并将这一段改成以下 maxThreads="150" scheme="https" secure="true" keystoreFile="bin/.keystore" keystorePass=" s3cret" clientAuth="false" sslProtocol="TLS" /> 之后启动tomcat就可以了,通过https方式访问8443端口,就能看到效果。如果用http访问之前的端口,那么还是普通的未加密连接。 到这里问题来了,我的目的是启用https,但现在http还能访问,那么就可以绕开httpshttps也就起不了什么作用了。因此要强制访问https。 打开你的web应用的web.xml文件,在最后加上这样一段 Protected Context /* CONFIDENTIAL 重启tomcat,现在你放问原来的地址,假设是http://localhost:8080/mywebapp/,可以看到,连接被重定向到了https的连接 https://localhost:8443/mywebapp/。这样,我们的目的达到了。 但似乎还有点小问题,keystorePass="s3cret",这个密码直接被明码方式卸载server.xml里。总觉得有还是有点不爽。 那么还有一种稍微复杂点的方式,我们使用openssl。 首先,需要下载openssl,为了方便,可以下载一个绿色版, 加压后除了openssl.exe以外,还有一个bat文件,这个可以帮助我们快速创建证书申请文件。 运行autocsr.bat,按照提示输入信息,之后按任意键确认。你会得到两个文件,一个server.key,这是私钥文件,还有一个名为certreq.csr的证书请求文件。 如果你要向证书颁发机构申请正式的安全证书,那么就把这个certreq.csr文件发给他们就行了。他们会给你发来两个cer文件,一个是服务器证书,一个是根证书 如果你只是要使用https,那么证书自己签署就可以了。 在命令行下进入刚才解压的目录,找到openssl.exe所在的目录,执行以下命令 openssl x509 -req -in certreq.csr -out cert.cer -signkey server.key -days 3650 现在你将得到一个名为cert.cer的证书文件。 修改server.xml将 maxThreads="150" scheme="https" secure="true" keystoreFile="bin/.keystore" keystorePass=" s3cret" clientAuth="false" sslProtocol="TLS" /> 修改为以下内容(假设cert.cer和server.key文件都放在tomcat的conf目录下) maxThreads="150" scheme="https" secure="true" SSLCertificateFile="conf/cert.cer" SSLCertificateKeyFile="conf/server.key" sslProtocol="TLS" /> PS.如果真的向证书颁发机构申请到了正式的安全证书,那么配置还有点不同,如下 maxThreads="150" scheme="https" secure="true" SSLCertificateFile="conf/server.cer" SSLCertificateKeyFile="conf/server.key" SSLCertificateChainFile="conf/intermediate.cer" sslProtocol="TLS" /> 因为证书颁发机构会给两个整数,一个是签署后的服务器证书,还有一个中级CA证书,所以要多一行配置。 可能证书颁发机构只会给你服务器证书也就是server.cer, 中级的CA证书即 intermediate.cer 需要到 证书颁发机构提供的网站中去下载,具体的操作会为证书颁发机构给发的邮箱中会有相关的提示 好了,到这里都配置完了,重启tomcat,就可以看到效果。不过,看到的通常会是一个exception,大概是说APR not available 如果遇到这个异常,说明你的tomcat没有安装apr支持 apr安装详见:http://www.blogjava.net/yongboy/archive/2009/08/31/293343.html 之后启动tomcat,问题应该解决了,看起来效果和第一种方式没什么不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值