http://www.barretlee.com/blog/2015/10/05/how-to-build-a-https-server/

http://blog.163.com/fangjinbao@126/blog/static/50873786201111265749952/

一、生成密钥、证书

第一步,为服务器端和客户端准备公钥、私钥

  1. # 生成服务器端私钥
  2. openssl genrsa -out server.key 1024
  3. # 生成服务器端公钥
  4. openssl rsa -in server.key -pubout -out server.pem
  5.  
  6. # 生成客户端私钥
  7. openssl genrsa -out client.key 1024
  8. # 生成客户端公钥
  9. openssl rsa -in client.key -pubout -out client.pem

第二步,生成 CA 证书

  1. # 生成 CA 私钥
  2. openssl genrsa -out ca.key 1024
  3. # X.509 Certificate Signing Request (CSR) Management.
  4. openssl req -new -key ca.key -out ca.csr
  5. # X.509 Certificate Data Management.
  6. openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt

在生成csr申请文件的时候需要填写公司的具体信息,如:

  1. keys openssl req -new -key ca.key -out ca.csr
  2. You are about to be asked to enter information that will be incorporated
  3. into your certificate request.
  4. What you are about to enter is what is called a Distinguished Name or a DN.
  5. There are quite a few fields but you can leave some blank
  6. For some fields there will be a default value,
  7. If you enter '.', the field will be left blank.
  8. -----
  9. Country Name (2 letter code) [AU]:CN
  10. State or Province Name (full name) [Some-State]:Zhejiang
  11. Locality Name (eg, city) []:Hangzhou
  12. Organization Name (eg, company) [Internet Widgits Pty Ltd]:My CA
  13. Organizational Unit Name (eg, section) []:
  14. Common Name (e.g. server FQDN or YOUR name) []:*.yunzhu.com
  15. Email Address []:

第三步,生成服务器端证书和客户端证书(服务器端证书需要特别注意申请的域名或者ip,客户端会验证自己请求的地址是否和证书里面的地址是否相同)

  1. # 服务器端需要向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR 文件
  2. openssl req -new -key server.key -out server.csr
  3. # 向自己的 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
  4. openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
  5.  
  6. # client 端
  7. openssl req -new -key client.key -out client.csr
  8. # client 端到 CA 签名
  9. openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

4、生成pkcs12格式证书(该格式证书包含CA证书,私钥和自己的证书)
在tomcat中实现双向认证有时需要pkcs12格式的证书(该证书包含根证书、服务器端或客户端的证书和密钥文件)

4.1、生成pkcs12服务器证书tomcat.p12,设置密码为1234563
openssl pkcs12 -export -in server/server.crt -inkey server/server.key -out server/tomcat.p12 -name tomcat -CAfile ca/ca.crt -caname root -chain
1234563(后边Tomcat的配置文件中需要)

4.2、生成pkcs12客户端证书client1.p12,设置密码为1234562

openssl pkcs12 -export -in client/client.crt -inkey client/client.key -out client/client.p12 -name client -chain -CAfile ca/ca.crt 
1234562  回车(设置密码为空,在用户导入时不用输入密码) 回车

5、有时可能需要别的格式的证书

生成pem格式证书

cat private/privatekey.crt  private/privatekey.key> private/privatekey.pem

cat server/server.crt  server/server.key > server/server.pem

二、tomcat实现双向认证

按照以上方法证书生成后,我们再配置TomCat即可实现双向认证。此时服务器端我们只用到服务器端pkcs12格式的证书tomcat.p12和CA的根证书ca.crt即可,客户端用到pkcs12格式的证书client.p12。

1、将以上创建的证书server.crt和tomcat.p12拷贝到tomcat主目录下的conf文件夹下。
cp server/server.crt server/tomcat.p12 /home/apache-tomcat-6.0.35/conf/

2、创建服务器信任的CA证书库(原理上导入CA证书即可,但是自己做实验发现导入CA证书导致服务端不信任客户端,导入客户端的证书之后就好了,不知道哪里出错了)
把ca.crt证书导入信任证书库,命令行模式进入tomcat主目录下的conf目录,执行以下命令: 
cd /home/apache-tomcat-6.0.35/conf/
keytool -keystore truststore.jks -keypass 111111 -storepass 111111 -alias ca -import -trustcacerts -file /usr/local/openssl/ca/ca.crt

*如果出现ca已经存在的错误,keytool -delete -alias ca -keystore truststore.jks      111111(keytool的密码,上一次使用时使用的密码)

可以用以下命令查看信任证书库内容:
keytool -keystore truststore.jks -keypass 111111 -storepass 111111 -list -v

(
 参考修改keytool的密码:
 keytool -storepasswd -new 123456  -storepass 111111 -keystore truststore.jks
  其中-storepass指定原密码,-new指定新密码。
  keytool -delete -alias ca -keystore truststore.jks  要求输入的密码就是上边修改的密码

)

3、配置Tomcat支持HTTPS双向认证
修改tomcat的conf目录里的server.xml文件($TOMCAT_HOME/conf/server.xml),找到类似下面内容的配置处,添加配置如下:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"
        keystoreFile="conf/tomcat.p12" keystorePass="1234563" keystoreType="PKCS12"
        truststoreFile="conf/truststore.jks" truststorePass="111111" truststoreType="JKS"
 />

配置好后,重启tomcat,

/home/apache-tomcat-6.0.35/bin/catalina.sh stop

/home/apache-tomcat-6.0.35/bin/catalina.sh start

可以监控8443端口看https是否启动起来:

netstat –an|grep 8443
tcp       0      0 :::8443                     :::*                    LISTEN

三、客户端安装证书:客户端导入client1.p12 证书,windows系统双击安装即可。

通过浏览器https方式访问服务器的web时会提示选择证书。

安装CA的证书来让客户端来信任服务端的证书

https://服务器Ip地址:服务端口号

openssl搭建双向认证https的更多相关文章

  1. openssl实现双向认证教程(服务端代码+客户端代码+证书生成)

    一.背景说明 1.1 面临问题 最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击. <信息安全工程>中接触过 ...

  2. openssl制作双向认证经过验证可行

    openssl制作双向认证经过验证可行 http://www.360doc.com/content/12/0524/15/2150778_213390447.shtml 2012-05-24  履历馆 ...

  3. windows下tomcat+nginx+openssl配置双向认证

    1. 基础知识 CA证书:https://blog.csdn.net/yangyuge1987/article/details/79209473 SSL双向认证原理:https://blog.csdn ...

  4. 双向认证 HTTPS双向认证

    [微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3 HTTPS双向认证使用说明 ...

  5. android怎么抓取双向认证https的包

    这里仅提供思路. 第一种方法: dex层面,可以直接用插日志方法,找到app使用的https库,这里以某app为例,使用okhttp, okhttp收发包相关代码: Request request = ...

  6. Https、OpenSSL自建CA证书及签发证书、nginx单向认证、双向认证及使用Java访问

    0.环境 本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo 必须安装nginx,必须安装openssl,(用apt-get upd ...

  7. nginx配置ssl加密(单双向认证、部分https)

    nginx配置ssl加密(单双向认证.部分https) nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始 ...

  8. [转帖]nginx配置ssl加密(单/双向认证、部分https)

    nginx配置ssl加密(单/双向认证.部分https) https://segmentfault.com/a/1190000002866627   nginx下配置ssl本来是很简单的,无论是去认证 ...

  9. Android Https双向认证 + GRPC

    keywords:android https 双向认证android GRPC https 双向认证 ManagedChannel channel = OkHttpChannelBuilder.for ...

随机推荐

  1. SniperOj-shorter-shellcode-x86

    shell-storm 这里可以有一些可以用的shellcode,不过自己写才是biner的骄傲 /奋斗 0x00 不会写shellcode(和一条咸鱼有什么区别/哭) 0x01 这题目前有俩种解法 ...

  2. POJ 2255 Tree Recovery——二叉树的前序遍历、后序遍历、中序遍历规则(递归)

    1.前序遍历的规则:(根左右) (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 对于图中二叉树,前序遍历结果:ABDECF 2.中序遍历的规则:(左根右) (1)中序遍历左子树 (2)访 ...

  3. python 删除大表数据

    #!/usr/bin/env python # encoding: utf-8 #@author: 东哥加油! #@file: del_tb_bigtable_statistic.py #@time: ...

  4. break、continue、exit、return的区别和对比

    break.continue.exit.return的区别和对比 一:说明 break.continue在条件循环语句及循环语句(for.while.if等)中用于控制程序的走向:而exit则用于种植 ...

  5. systemverilog 之interface/timing region/program

    1.connecting the testbench and the design 2.verilog connection review 3.systemverilog interfaces 4.s ...

  6. perl学习之子程序

    一.定义子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:sub subroutine{statements;}二.调 ...

  7. 绑定用户id,用户权限认证

    上面这个就是为了把user_id与文章关联起来 文章需要跟用户关联,所以要去文章模型中加以关联 这样就可以直接在模板中进行关联处理 权限认证 首先要创建policy php artisan make: ...

  8. leepcode作业解析-5-15日

    1.删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外 ...

  9. LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal

    题目 Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume t ...

  10. bat 获取命令执行后的多个返回值,并取最后一个

    最近在使用bat,遇到了这样的问题,获取adb shell cat命令之后的所有返回值,查了很长时间,才找到,现分享给大家. 举例如下: @for /f "tokens=*" %% ...