详解关于Pfx与cer之间的关系

Pfx与cer均为证书的文件格式,它们之间区别为

1.带有私钥的证书

由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。

2.二进制编码的证书

证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。

3.编码的证书

证书中没有私钥, 编码格式的证书文件,也是以cer作为证书文件后缀名。

由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。

在pfx证书的导入过程中有一项是“标志此密钥是可导出的。这将您在稍候备份或传输密钥”。一般是不选中的,如果选中,别人就有机会备份你的密钥了。如果是不选中,其实密钥也导入了,只是不能再次被导出。这就保证了密钥的安全。

如果导入过程中没有选中这一项,做证书备份时“导出私钥”这一项是灰色的,不能选。只能导出cer格式的公钥。如果导入时选中该项,则在导出时“导出私钥”这一项就是可选的。

如果要导出私钥(pfx),是需要输入密码的,这个密码就是对私钥再次加密,这样就保证了私钥的安全,别人即使拿到了你的证书备份(pfx),不知道加密私钥的密码,也是无法导入证书的。相反,如果只是导入导出cer格式的证书,是不会提示你输入密码的。因为公钥一般来说是对外公开的,不用加密。

下面介绍关于自签名证书导出pfx和cer证书

完整代码:

1 public sealed class DataCertificate

2 {

3 #region 生成证书

4 ///

5 /// 根据指定的证书名和makecert全路径生成证书(包含公钥和私钥,并保存在MY存储区)

6 ///

7 ///

8 ///

9 ///

10 public static bool CreateCertWithPrivateKey(string subjectName, string makecertPath)

11 {

12 subjectName = “CN=” + subjectName;

13 string param = " -pe -ss my -n “” + subjectName + “” ";

14 try

15 {

16 Process p = Process.Start(makecertPath, param);

17 p.WaitForExit();

18 p.Close();

19 }

20 catch (Exception e)

21 {

22 return false;

23 }

24 return true;

25 }

26 #endregion

27

28 #region 文件导入导出

29 ///

30 /// 从WINDOWS证书存储区的个人MY区找到主题为subjectName的证书,

31 /// 并导出为pfx文件,同时为其指定一个密码

32 /// 并将证书从个人区删除(如果isDelFromstor为true)

33 ///

34 /// 证书主题,不包含CN=

35 /// pfx文件名

36 /// pfx文件密码

37 /// 是否从存储区删除

38 ///

39 public static bool ExportToPfxFile(string subjectName, string pfxFileName,

40 string password, bool isDelFromStore)

41 {

42 subjectName = “CN=” + subjectName;

43 X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

44 store.Open(OpenFlags.ReadWrite);

45 X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates;

46 foreach (X509Certificate2 x509 in storecollection)

47 {

48 if (x509.Subject == subjectName)

49 {

50 Debug.Print(string.Format(“certificate name: {0}”, x509.Subject));

51

52 byte[] pfxByte = x509.Export(X509ContentType.Pfx, password);

53 using (FileStream fileStream = new FileStream(pfxFileName, FileMode.Create))

54 {

55 // Write the data to the file, byte by byte.

56 for (int i = 0; i < pfxByte.Length; i++)

57 fileStream.WriteByte(pfxByte[i]);

58 // Set the stream position to the beginning of the file.

59 fileStream.Seek(0, SeekOrigin.Begin);

60 // Read and verify the data.

61 for (int i = 0; i < fileStream.Length; i++)

62 {

63 if (pfxByte[i] != fileStream.ReadByte())

64 {

65 fileStream.Close(); 66 return false;

67 }

68 }

69 fileStream.Close();

70 }

71 if (isDelFromStore == true)

72 store.Remove(x509);

73 }

74 }

75 store.Close();

76 return true;

77 }

78 ///

79 /// 从WINDOWS证书存储区的个人MY区找到主题为subjectName的证书,

80 /// 并导出为CER文件(即,只含公钥的)

81 ///

82 ///

83 ///

84 ///

85 public static bool ExportToCerFile(string subjectName, string cerFileName)

86 {

87 subjectName = “CN=” + subjectName;

88 X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

89 store.Open(OpenFlags.ReadWrite);

90 X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates;

91 foreach (X509Certificate2 x509 in storecollection)

92 {

93 if (x509.Subject == subjectName)

94 {

95 Debug.Print(string.Format(“certificate name: {0}”, x509.Subject));

96 //byte[] pfxByte = x509.Export(X509ContentType.Pfx, password);

97 byte[] cerByte = x509.Export(X509ContentType.Cert);

98 using (FileStream fileStream = new FileStream(cerFileName, FileMode.Create))

99 {

100 // Write the data to the file, byte by byte.

101 for (int i = 0; i < cerByte.Length; i++)

102 fileStream.WriteByte(cerByte[i]);

103 // Set the stream position to the beginning of the file.

104 fileStream.Seek(0, SeekOrigin.Begin);

105 // Read and verify the data.

106 for (int i = 0; i < fileStream.Length; i++)

107 {

108 if (cerByte[i] != fileStream.ReadByte())

109 {

110 fileStream.Close();

111 return false;

112 }

113 }

114 fileStream.Close();115 }

116 }

117 }

118 store.Close();

119 store = null;

120 storecollection = null;

121 return true;

122 }

123 #endregion

124

125 #region 从证书中获取信息

126 ///

127 /// 根据私钥证书得到证书实体,得到实体后可以根据其公钥和私钥进行加解密

128 /// 加解密函数使用DEncrypt的RSACryption类

129 ///

130 ///

131 ///

132 ///

133 public static X509Certificate2 GetCertificateFromPfxFile(string pfxFileName,

134 string password)135 {

136 try

137 {

138 return new X509Certificate2(pfxFileName, password, X509KeyStorageFlags.Exportable);

139 }

140 catch (Exception e)

141

{142 return null;

143 }

144 }

145 ///

146 /// 到存储区获取证书

147 ///

148 ///

149 ///

150 public static X509Certificate2 GetCertificateFromStore(string subjectName)

151 {

152 subjectName = “CN=” + subjectName;

153 X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);

154 store.Open(OpenFlags.ReadWrite);

155 X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates;

156 foreach (X509Certificate2 x509 in storecollection)

157 {

158 if (x509.Subject == subjectName)

159 {

160 return x509;

161 }

162 }

163 store.Close();

164 store = null;

165 storecollection = null;166 return null;

167 }

168 ///

169 /// 根据公钥证书,返回证书实体

170 ///

171 ///

172 public static X509Certificate2 GetCertFromCerFile(string cerPath)

173 {

174 try

175 {

176 return new X509Certificate2(cerPath);177 }

178 catch (Exception e)179 {

180 return null;181 }

182 }

183 #endregion184 }

SSL证书采用了技术含量比较高的加密技术。

原文地址:https://blog.51cto.com/13931430/2368780

时间: 2024-11-06 21:27:42

详解关于Pfx与cer之间的关系的相关文章

tiny_cnn代码详解(3)——层间继承关系

在上一篇博文中我们顺利将tiny_cnn的程序调试通过,在这篇博文中我们尝试从整体角度给出对tiny_cnn这个深度学习框架的解读,重点论述一下其各个层直接类封装的继承关系. 一.卷积神经网络快速入门 tiny_cnn作为卷积神经网络的一种实现形式,在探讨其框架结构之前,首先需要简要介绍一些卷积神经网络相关的知识.首先,给出经典卷积神经网络的网络结构: 这个是经典的LeNet-5的网络结构图,五层网络.最早用于支票上的手写数字识别,也是最早的商业化的深度学习模型.从上图中可以看出,卷积神经网络主

C语言 详解多级指针与指针类型的关系

//通常意义上,指针类型指的是‘指针值’的类型,而不是‘指针’的类型 //V推论①:变量的步长只与变量的类型有关 //普通变量名是一段内存空间的标识,普通变量名代表的是一段内存空间, //对于复杂变量(例如指针):通常的指针的步长准确来说是指‘指针值’的步长,而不是指‘指针本身’的步长,指针本身的步长永远是4, //我们通常说的指针类型往往指的是‘指针值’的类型,,而不是‘指针’的类型 //而指针类型就是一个占4个字节大小内存空间的一种类型(从来没有人定义过指针类型,人们定义的都是‘指针值’的类

Xamarin+Prism开发详解六:DependencyService与IPlatformInitializer的关系

祝各位2017年事业辉煌!开年第一篇博客,继续探索Xamarin.Forms… 为什么我做Xamarin开发的时候中意于Prism.Forms框架?本章为你揭晓. 实例代码地址:https://github.com/NewBLife/XamarinDemo/tree/master/TextToSpeechDemo DependencyService 1.简介 软件开发有一个原则叫[依赖倒置Dependence Inversion Principle ] A.高层次的模块不应该依赖于低层次的模块,

(转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表

郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理了,因为交换机是根据MAC地址表转发数据帧的.在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的. 交换机的工作原理 交换机在接收到数据帧以后,首先.会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着.会检查自己的MAC

计算机基础-Socket详解

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进

Linux的SOCKET编程详解(转)

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进

详解Linux用户及权限管理

用户标识(userID):范围是0~65535 管理员:0 普通用户:1~65535 系统用户:1~499(CentOS 6).1~999(CentOS 7) 登录用户:500~60000(CentOS 6).1000~60000(CentOS 7) 人能够快速识别字符,而电脑能够快速识别数字(用户标识),然而系统存在一个名称解析库/etc/passwd.能快速从username转换成userID 登录系统时,需要输入账号和密码.与事先存储的信息做比较.需要在/etc/passwd查找到user

转:TCP/IP详解--举例明白发送/接收缓冲区、滑动窗口协议之间的关系

原文地址:http://blog.csdn.net/yusiguyuan/article/details/21439633#1536434-tsina-1-74921-66a1f5d8f89e9ad52626f6f40fdeadaa  TCP/IP详解--举例明白发送/接收缓冲区.滑动窗口协议之间的关系. 一个例子明白发送缓冲区.接受缓冲区.滑动窗口协议之间的关系. 在上面的几篇文章中简单介绍了上述几个概念在TCP网络编程中的关系,也对应了几个基本socket系统调用的几个行为,这里再列举一个例

解析activity之间数据传递方法的详解

转自:http://www.jb51.net/article/37227.htm 本篇文章是对activity之间数据传递的方法进行了详细的分析介绍,需要的朋友参考下 1  基于消息的通信机制 Intent--------boudle,extra用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等详细介绍下Intent机制Intent包含两部分:1 目的[action]-------要去到哪里去2 内容[category.data]----------路上带些什么,