证书管理

windows系统有两个证书管理工具certlm.msccertmgr.msc,前者是本地计算机的证书管理工具,而后者是当前用户的证书管理工具。在导入证书时需要注意。如果证书仅是给当前用户使用那么就可以使用后者。并且在启动后者时不需要管理权限,而前者需要管理权限,否则就只能查看证书而不能导入证书。还有一种方式就是从 “开始” 菜单中选择 “运行”,然后输入 mmc。从 “ 文件 “ 菜单中,选择 “ 添加/删除管理单元”。

证书存储位置

证书的存储位置,只有currentuser(默认值)或 localmachine两个值。

证书的私钥文件在计算机上的存储位置?

Windows xp存放在:C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys
Windows vista存放在:C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

创建证书

makecert.exe -sr CurrentUser -ss My -a sha1 -n CN=Michael -sky exchange -pe
!-sr : 指定的证书存储区中的注册表位置。 currentUser 指定注册版存储位置为 HKEY_CURRENT_USER. localMachine 指定注册版存储位置为 HKEY_LOCAL_MACHINE.
!-ss : 指定证书存储的位置。
!-a : 指定相关的算法,可以选择 MD5 算法或者 SHA1算法
!-n : 指定证书的名称。该名称遵循X.500命名标准。简单例子如 "CN=MyName" 格式,如果没有指定/n开关,证书默认的名称是"Joe's Software Emporium"。
!-sky : 证书键类型。可以设置为 exchange 或者 signature。
!-pe : 证书可导出

HTTPS协议

双向的身份认证

客户端和服务端在传输数据之前,会通过基于X.509证书对双方进行身份认证 。具体过程如下:

  1. 客户端发起 SSL 握手消息给服务端要求连接。
  2. 服务端证书发送给客户端。
  3. 客户端检查服务端证书,确认是否由自己信任的证书签发机构签发。 如果不是,将是否继续通讯的决定权交给用户选择 ( 注意,这里将是一个安全缺陷 )。如果检查无误或者用户选择继续,则客户端认可服务端的身份。
  4. 服务端要求客户端发送证书,并检查是否通过验证。失败则关闭连接,认证成功则从客户端证书中获得客户端的公钥,一般为1024位或者 2048位。到此,服务器客户端双方的身份认证结束,双方确保身份都是真实可靠的。

数据传输的机密性

客户端和服务端在开始传输数据之前,会协商传输过程需要使用的加密算法。 客户端发送协商请求给服务端, 其中包含自己支持的非对称加密的密钥交换算法 ( 一般是RSA), 数据签名摘要算法 ( 一般是SHA或者MD5) , 加密传输数据的对称加密算法 ( 一般是DES),以及加密密钥的长度。 服务端接收到消息之后,选中安全性最高的算法,并将选中的算法发送给客户端,完成协商。客户端生成随机的字符串,通过协商好的非对称加密算法,使用服务端的公钥对该字符串进行加密,发送给服务端。 服务端接收到之后,使用自己的私钥解密得到该字符串。在随后的数据传输当中,使用这个字符串作为密钥进行对称加密

以上过程简要描述如下:客户端通过服务端的证书确认网站合法性,客户端和服务端都要相互交换证书,客户端和服务端通过对方证书的公钥加密协商后面实际数据内容通信的对称加密算法和密钥。然后使用该协商好的密钥进行对称加密数据通信。为什么要切换到对称加密算法,因为对称加密比非对称加密效率要提高很多。

文件签名

signtool sign /a /fd SHA256 ConsoleAppTest.exe

手动验证签名情况

sigcheck -u -e d:\

X.509证书的结构

  1. 版本号,标识证书的版本(版本1、版本2或是版本3)。
  2. 序列号,标识证书的唯一整数,由证书颁发者分配的本证书的唯一标识符。
  3. 签名,用于签证书的算法标识,由对象标识符加上相关的参数组成,用于说明本证书所用的数字签名算法。例如,SHA-1和RSA的对象标识符就用来说明该数字签名是利用RSA对SHA-1杂凑加密。
  4. 颁发者,证书颁发者的可识别名(DN)。
  5. 有效期,证书有效期的时间段。本字段由”Not Before”和”Not After”两项组成,它们分别由UTC时间或一般的时间表示(在RFC2459中有详细的时间表示规则)。
  6. 主体,证书拥有者的可识别名,这个字段必须是非空的,除非你在证书扩展中有别名。
  7. 主体公钥信息,主体的公钥(以及算法标识符)。
  8. 颁发者唯一标识符,标识符—证书颁发者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。
  9. 主体唯一标识符,证书拥有者的唯一标识符,仅在版本2和版本3中有要求,属于可选项。

使用git bash中内置的openssl生成pem证书

openssl genrsa -out michaelpem.pem 1024

日志文件夹

对文件进行签名

openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048
openssl rsa -in private.pem -pubout -out public.pem
openssl dgst -sha256 -sign private.pem -out signature.bin file_to_sign.txt
openssl dgst -sha256 -verify public.pem -signature signature.bin file_to_sign.txt

日志文件夹