https认证

目录

http和https的区别

证书的颁发和认证

单向认证流程

双向认证流程


http和https的区别

https = http + ssl/tls

  • 加密

    • HTTP:数据传输过程中不加密,容易被截获和篡改。
    • HTTPS:使用SSL/TLS协议对传输的数据进行加密,保护数据传输过程中的安全性。
  • 端口

    • HTTP:默认使用端口80。
    • HTTPS:默认使用端口443。
  • 安全性

    • HTTP:不提供数据加密,安全性较低。
    • HTTPS:提供数据加密和完整性校验,安全性较高。
  • 证书

    • HTTP:不需要证书。
    • HTTPS:需要SSL证书来启用加密,并验证服务器的身份。
  • 性能

    • HTTP:由于不加密数据,性能略高于HTTPS。
    • HTTPS:由于需要进行加密和解密,可能会有一定的性能开销。
  • 搜索引擎优化(SEO)

    • HTTP:搜索引擎可能会对没有使用HTTPS的网站进行降权。
    • HTTPS:搜索引擎倾向于优先索引和展示使用HTTPS的网站。
  • 浏览器显示

    • HTTP:在大多数现代浏览器中,HTTP网站通常显示为"不安全"。
    • HTTPS:浏览器会显示一个锁形图标,表示网站是安全的。
  • 成本

    • HTTP:通常免费。
    • HTTPS:需要购买SSL证书,可能会有一定的成本。
  • 应用场景

    • HTTP:适用于不需要传输敏感信息的网站,如新闻网站、博客等。
    • HTTPS:适用于需要传输敏感信息的网站,如网上银行、在线购物、电子邮件等

证书的颁发和认证

1. 公开密钥(Public Key) 🔑

数字证书的核心功能之一是包含证书持有者的公开密钥。这是一个非常关键的信息,因为它允许数据发送者加密信息,仅证书持有者的私钥能解开。这种机制确保了数据在传输过程中的安全性。

2. 主体信息(Subject) 🆔

证书中还会详细记录主体信息,即证书持有者的身份信息。这可能包括个人名称、组织名称、部门名称等。通过这些信息,可以验证证书持有者的真实身份,从而增加交易的信任度。

3. 颁发者(Issuer) 🏢

颁发者信息表明了哪一个权威机构颁发了这个证书。这是证书信任链的重要一环,帮助用户识别和信任证书的有效性。权威机构的严格审核流程保证了证书的可靠性。

4. 有效期(Validity Period) 📅

每个数字证书都有其有效期限,这是证书可被认为有效的时间范围。有效期通常包含起始日期和结束日期。过期的证书不能被信任,需及时更新。

5. 证书序列号(Serial Number) 🔢

为了确保每个证书的唯一性,每个证书都会被赋予一个独一无二的序列号。这个号码在证书的生命周期内保持不变,可以用来追踪或撤销证书。

6. 数字签名(Digital Signature) 🖋️

证书中还包含了颁发机构对证书的数字签名。这是一种算法处理的结果,用来验证证书的完整性和真实性。只有通过了数字签名的验证,证书内容才被认为是未被篡改的。

7. 使用限制(Usage Restrictions) 🚫

有些证书可能会有特定的使用限制,例如只能用于加密邮件、只能 用于身份验证等。这些限制确保证书不会被误用,同时也保护了证书持有者的权益

单向认证流程

单向认证流程中,服务器端保存着公钥证书和私钥两个文件,整个握手过程如下:

  1. 客户端发起建立HTTPS连接请求,将SSL/TLS 协议版本的信息发送给服务器端;
  2. 服务器端将本机的公钥证书(server.crt)发送给客户端;
  3. 客户端读取公钥证书(server.crt),取出了服务端公钥;
  4. 客户端生成一个随机数(密钥R),用刚才得到的服务器公钥去加密这个随机数形成密文,发送给服务端;
  5. 服务端用自己的私钥(server.key)去解密这个密文,得到了密钥R
  6. 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了

双向认证流程

  1. 客户端发起建立HTTPS连接请求,将SSL/TLS协议版本的信息发送给服务端;
  2. 服务器端将本机的公钥证书(server.crt)发送给客户端;
  3. 客户端读取公钥证书(server.crt),取出了服务端公钥;
  4. 客户端将客户端公钥证书(client.crt)发送给服务器端;
  5. 服务器端使用根证书(root.crt)解密客户端公钥证书,拿到客户端公钥;
  6. 客户端发送自己支持的加密方案给服务器端;
  7. 服务器端根据自己和客户端的能力,选择一个双方都能接受的加密方案,使用客户端的公钥加密后发送给客户端;
  8. 客户端使用自己的私钥解密加密方案,生成一个随机数R,使用服务器公钥加密后传给服务器端;
  9. 服务端用自己的私钥去解密这个密文,得到了密钥R
  10. 服务端和客户端在后续通讯过程中就使用这个密钥R进行通信了。
     


 

在使用 `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认证来增强安全性,即同时验证客户端和服务器证书。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱思考的发菜_汽车网络信息安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值