使用openssl制作证书和进行CMS格式数字签名

openssl中有如下后缀名的文件
.key格式:私有的密钥
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crt格式:证书文件,certificate的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
 
OpenSSL实现了PKCS7,为什么还要实现CMS?
PKCS7和CMS看起来一样,CMS基于PKCS7,还基于一个Privacy-Enhanced Mail的标准, 因此CMS也可解析PKCS7签名
区别是:PKCS#7不支持递归嵌套, CMS支持,CMS还有增加了其它一些东西

1.数字签名
非对称加密算法的效率是非常低的。
将内容使用hash函数生成摘要,再用私钥对摘要进行加密,生成数字签名。然后将内容附上数字签名一同传输。
收件方收到后,用公钥对数字签名进行解密,得到摘要,然后再对原内容进行hash生成摘要,比对这两个摘要是否相同,相同则说明内容没有被篡改。

2.数字证书
由CA颁发给网站的身份证书,里面包含了该网站的公钥,有效时间,网站的地址,CA的数字签名等。
所谓的CA数字签名,实际上就是使用了CA的私钥将网站的公钥等信息进行了签名,当客户端请求服务器的时候,网站会把证书发给客户端,客户端首先可以通过CA的数字签名校验CA的身份,也能证明证书的真实完整性。客户端有没有可能到一个假冒的CA去校验数字证书呢?不太可能,因为CA的地址是内嵌在浏览器中的,很难被篡改。

---------------------------------------------------------------

1. 创建根证书,rootca.pem为根证书
vi rootca.cnf
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = extensions
 
[ req_distinguished_name ]
C = CN
O = Test
CN = RootCA
 
[ extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints = CA:TRUE
keyUsage = cRLSign, keyCertSign

echo unique_subject=no > index.attr
openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 -config rootca.cnf -outform PEM -out rootca.pem -keyout rootca_pri.pem
openssl x509 -in rootca.pem -inform pem -outform der -out rootca.der

2. 颁发二级证书(公钥证书),signcert.pem为公钥证书
vi signcert.cnf
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = extensions
 
[ req_distinguished_name ]
C = CN
O = Test
CN = Signing Certificate
 
[ extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
keyUsage = critical, nonRepudiation, digitalSignature
extendedKeyUsage = codeSigning

openssl genrsa -out signcert_pri.pem 2048
openssl req -new -config signcert.cnf -out signcert.csr -key signcert_pri.pem
openssl x509 -req -in signcert.csr -CA rootca.pem -CAkey rootca_pri.pem -CAcreateserial -out signcert.pem -days 3650 -extensions extensions -extfile signcert.cnf
openssl x509 -in signcert.pem -inform pem -outform der -out signcert.der


3. 创建CMS签名。
使用私钥证书signcert.pem和私钥signcert_pri.pem创建CMS格式签名。source.txt为签名前原始文件,signed_source.txt为签名后文件(signed_source.txt即为创建的CMS签名)
openssl cms -sign -in source.txt -inkey signcert_pri.pem -signer signcert.pem -out signed_source.txt -outform PEM -nodetach


 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来依次回答你的两个问题。 ## 1. openssl使用 OpenSSL是一个强大的开源加密工具包,可以用于加密、解密、签名和验证数据等操作。 具体使用方法如下: 1. 安装OpenSSL:可以从官网下载安装包,根据操作系统安装。 2. 生成密钥对:使用openssl命令生成公私钥对。 ```bash openssl genrsa -out rsa_private_key.pem 2048 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem ``` 3. 加密数据:使用公钥加密数据。 ```bash openssl rsautl -encrypt -in plaintext.txt -out ciphertext.txt -inkey rsa_public_key.pem -pubin ``` 4. 解密数据:使用私钥解密数据。 ```bash openssl rsautl -decrypt -in ciphertext.txt -out plaintext.txt -inkey rsa_private_key.pem ``` 5. 签名数据:使用私钥对数据进行签名。 ```bash openssl dgst -sha256 -sign rsa_private_key.pem -out signature.bin plaintext.txt ``` 6. 验证签名使用公钥对签名进行验证。 ```bash openssl dgst -sha256 -verify rsa_public_key.pem -signature signature.bin plaintext.txt ``` ## 2. C#加密和数字签名 C#也提供了加密和数字签名的功能,可以使用System.Security.Cryptography命名空间下的类来实现。 具体使用方法如下: 1. 生成密钥对:使用RSACryptoServiceProvider类生成公私钥对。 ```csharp RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048); string privateKey = rsa.ToXmlString(true); string publicKey = rsa.ToXmlString(false); ``` 2. 加密数据:使用公钥加密数据。 ```csharp byte[] data = Encoding.UTF8.GetBytes("Hello World!"); byte[] encryptedData = rsa.Encrypt(data, false); ``` 3. 解密数据:使用私钥解密数据。 ```csharp byte[] decryptedData = rsa.Decrypt(encryptedData, false); string plaintext = Encoding.UTF8.GetString(decryptedData); ``` 4. 签名数据:使用私钥对数据进行签名。 ```csharp byte[] data = Encoding.UTF8.GetBytes("Hello World!"); byte[] signature = rsa.SignData(data, new SHA256CryptoServiceProvider()); ``` 5. 验证签名使用公钥对签名进行验证。 ```csharp bool verified = rsa.VerifyData(data, new SHA256CryptoServiceProvider(), signature); ``` 以上就是关于openssl使用和C#加密和数字签名的简单介绍,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值