飞污熊博客

静下心来做一件事

一般设置代理方式是vi /etc/profile,然后添加下面内容

1
2
export http_proxy = http://username:password@yourproxy.com:8080/
export ftp_proxy = http://username:password@yourproxy:8080/

但是这种直接在配置文件里面写自己域账号的明文密码很不安全,如果是几个人共享一台机器,其他人可以直接看到你的密码。

阅读全文 »

SSL/TLS 证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书。 服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书。但是,如果服务器需要对客户端进行身份验证, 该怎么办?这就需要双向认证证书。

为什么需要另一种认证方式的证书?因为当同时使用两种认证方式的证书时,有助于双方(即客户端和服务器端)之间的相互认证。 另外,与标准SSL证书不同的是,双向认证的SSL证书实际上被称作为个人认证证书(PAC)。

双向认证流程图如下: img.png

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

本篇直接通过代码演示如何在Java实现证书的双向认证。

阅读全文 »

密码学领域有对称加密和非对称加密算法,本篇将使用Java语言来实现几种常见的加解密算法。

完整源码请参考 GitHub源码

对称加密算法概念

加密密钥和解密密钥相同,大部分算法加密揭秘过程互逆。

特点:算法公开、(相比非对称加密)计算量小、加密速度快、效率高。

弱点:双方都使用同样的密钥,安全性得不到保证。

常用对称加密算法

  • DES(Data Encryption Standard)
  • 3DES(DES加强版,使用3次DES计算,Triple DES,DESede)
  • AES(Advanced Encryption Standard,3DES加强版)

这里只列出最常用的AES算法实现,也是安全等级最高,推荐使用的对称加密算法,其他实现请参考我的GitHub上的源码。

阅读全文 »

环境配置

1.修改openssl配置文件

通过vi编辑文件/etc/pki/tls/openssl.cnf,更新内容如下,有的部分是更新,有的是增加。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[ CA_default ]
req_extensions = v3_req

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[ v3_server_client ]
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage = critical, serverAuth, clientAuth
crlDistributionPoints = URI:https://example.com/xxx.crl

[ v3_sign ]
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, codeSigning

[ v3_ca ]
basicConstraints = critical, CA:true
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
keyUsage = critical, cRLSign, digitalSignature, keyCertSign
crlDistributionPoints=URI:https://example.com/root.crl

[ crl_ext ]
authorityKeyIdentifier=keyid:always, issuer:always

**强烈提醒:**如果是要做客户端证书认证,证书类型一定要选v3_server_client

X.509 v3证书定义的扩展为用户或公钥以及在CA间的管理提供了额外的功能。X.509 v3证书的格式允许组织使用私有的扩展。 证书中的扩展被定义为criticalnon-critical。 一个使用证书的系统在接收到设置为critical但无法识别或无法处理的证书时,必须拒绝处理该证书。 一个non-critical的证书在无法识别时可能会被忽略。

  • 约束1:主机已经安装了OpenSSL,版本号1.0.2
  • 约束2:生成CA根证书前,请提前规划以下环境配置参数。
    阅读全文 »

CipherSuite这个名词目前没看到有好的中文翻译,个人觉得翻译成加密算法套件比较合适。 Cipher泛指是密码学的加密算法,例如 aes, rsa, ecdh 等。 tls是由各类基础算法作为原语组合而成,一个CipherSuite是4个算法的组合:

  • 1个key exchange(密钥交换)算法
  • 1个authentication(身份认证)算法
  • 1个encryption(加密)算法
  • 1个message authentication code (消息认证码,简称MAC)算法

比如一个例子TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。 表示的含义是TLS_ECDHE(密钥交换算法)_RSA(身份认证算法)_WITH_AES_128_GCM(AES128GCM对称加密算法) _SHA256(完整性包含的MAC算法)。

阅读全文 »