https认证

关于HTTPS

HTTPS是在HTTP基础上实现的一种更安全的身份认证及数据传输协议.百度百科的解释是这样的:

HTTPS (全称:Hyper Text Transfer Protocol over Secure Socket Layer)是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL

上面的定义说明了HTTPS的实现基础是ssl,但在整个认证过程中还有一个重要的权威机构CA(Certificate Authority),先来看看这个CA.

关于CA

电子商务认证授权机构(CA, Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任.

这个机构主要就是为网络服务器颁发证书,使网络服务器在互联网中可信.建立这种信任关系的是各个机构的根证书,根证书可以对他们签名的所有服务器进行验证.要得到这种证书需要到对应的机提交申请.对于要求不高的情况下可以使用 Let’s encrypt.

SSL协议

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持.SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装,压缩,加密等基本功能的支持.SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等.

SSL Handshake Protocol握手过程中身份认证和秘钥协商步骤

  1. 客户端(浏览器)发送自己的ssl版本号,支持的算法等信息到服务器
  2. 服务端返回自己的ssl版本号,随机数及服务器的证书
  3. 客户端验证server的证书是否合法,验证不通过给出提示
  4. 验证通过客户端会发送自己的证书给服务器,交由服务器认证
  5. 服务器验证客户端证书,如果验证不同通过,会直接断掉链接
  6. 验证通过,将选好的加密方案通过客户端的公钥加密返回给客户端
  7. 客户端通过私钥解开加密方式,生成随机数,作为对称加密的秘钥,使用服务器的公钥加密发送给服务器
  8. 服务器通过私钥解密出对称机密的秘钥
  9. 开始安全数据传输工作

上面几个步骤成功后之后,就建立了一个双向的认证(单向认证没有上面4和5)的安全的数据传输通道,接下来看一下如何使用openssl来建立自签名的双向认证

openssl自签名双向认证
  1. 获取CA证书

    
    #生成ca私钥文件,长度为1024加密方式为rsa
    
    openssl genrsa -out ca.key 1024
    
    
    #采用x509标准生成自签名证书
    
    openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj "/C=CN/ST=SX/L=XA/O=Team/OU=sun"
    
  2. 获取server端证书

    
    #生成server秘钥文件
    
    openssl genrsa -out server.key 1024
    
    
    #生成证书请求文件
    
    openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=SX/L=XA/O=Team/OU=test/CN=aa"
    
    
    #生成server CA自签名证书
    
    openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
    
    
    #验证server端证书
    
    docker@myvm2:~$ openssl verify -CAfile ca.crt server.crt 
    server.crt: OK
    
  3. 获取client端证书

     #阿道夫
     openssl genrsa -out client.key 1024
     #阿道夫
     openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=SX/L=XA/O=Team/OU=test/CN=aa"
     #
     openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key
    
     这步会出错:
     unable to access the ./demoCA/newcerts directory ./demoCA/newcerts: 
     No such file or directory
     解决办法:
     mkdir -p ./demoCA/newcerts
     touch demoCA/index.txt
     touch demoCA/serial
     echo 01 > demoCA/serial
     #验证
    docker@myvm2:~$ openssl verify -CAfile ca.crt client.crt 
    client.crt: OK
    
  4. 使用openssl 验证

     #开启server端证书验证功能
    
     docker@myvm2:~$ openssl s_server -accept 10086 -key server.key -cert server.crt -Verify 5
     verify depth is 5, must return a certificate
     Using default temp DH parameters
     ACCEPT
    
     #新开一个窗口执行客户端链接命令,带上客户端的证书,否则server会自动断掉链接
     docker@myvm2:~$  openssl s_client -connect localhost:10086 -CAfile ca.crt  -cert client.crt -key client_key
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 `HttpURLConnection` 进行单向HTTPS认证时,可以通过以下步骤实现: 1. 创建一个信任管理器: ```java TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { // 不验证客户端证书 } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { // 验证服务器证书 try { chain[0].checkValidity(); } catch (Exception e) { throw new CertificateException("证书无效"); } } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; ``` 2. 创建一个SSL上下文: ```java SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new SecureRandom()); ``` 3. 设置`HttpURLConnection`的SSL Socket Factory: ```java HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); ``` 4. 发起HTTPS请求: ```java URL url = new URL("https://example.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 可选:设置其他请求参数 connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); connection.setReadTimeout(5000); // 发起请求 int responseCode = connection.getResponseCode(); // 处理响应 if (responseCode == HttpURLConnection.HTTP_OK) { // 读取响应数据 InputStream inputStream = connection.getInputStream(); // ... } else { // 处理错误情况 } ``` 以上代码将忽略对客户端证书的验证,只验证服务器证书的有效性。同样需要注意,在生产环境中建议使用双向HTTPS认证来增强安全性,即同时验证客户端和服务器证书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值