- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Open SSL 生成 RSA key 对并使用 SHA1 算法签署 token 。使用 OpenSSL 成功生成 key 对,结果我获得了“PEM”证书。
要继续签名过程,我需要 DER 格式的私钥。如果有人知道,请分享使用 openssl 将 PEM 证书转换为 DER 证书的代码。我尝试使用终端,它工作正常。但是,我需要为此采用编程方法。
以下是我生成PEM证书的代码:
-(void)generateCertificate
{
RSA *rsaKeyPair = NULL;
rsaKeyPair = RSA_new();
BIGNUM *e = BN_new();
BN_set_word(e, 65537);
//Generating KeyPair
RSA_generate_key_ex(rsaKeyPair, 1024, e, NULL);
int keylen, keylenPub;
char *pem_key, *pem_pub_key;
/* To get the C-string PEM form: */
BIO *bio = BIO_new(BIO_s_mem());
BIO *bioPubKey = BIO_new(BIO_s_mem());
//Writing RSA Private and Public Keys
PEM_write_bio_RSAPrivateKey(bio, rsaKeyPair, NULL, NULL, 0, NULL, NULL);
PEM_write_bio_RSAPublicKey(bioPubKey, rsaKeyPair);
keylen = BIO_pending(bio);
pem_key = calloc(keylen+1, 1); /* Null-terminate */
BIO_read(bio, pem_key, keylen);
//Reading RSA Public Key Bio
keylenPub = BIO_pending(bioPubKey);
pem_pub_key = calloc(keylenPub+1, 1); /* Null-terminate */
BIO_read(bioPubKey, pem_pub_key, keylenPub);
NSString *strData = [NSString stringWithUTF8String:pem_key];
[strData writeToFile:[self privateKeyPath] atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSString *strPubData = [NSString stringWithUTF8String:pem_pub_key];
[strPubData writeToFile:[self publicKeyPath] atomically:YES encoding:NSUTF8StringEncoding error:nil];
BIO_free_all(bio);
RSA_free(rsaKeyPair);
}
并且:
// Documents directory path
-(NSString *)privateKeyPath
{
NSString *documentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [documentsFolder stringByAppendingPathComponent:@"rsaprivkey.pem"];
}
和:
-(NSString *)publicKeyPath
{
NSString *documentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [documentsFolder stringByAppendingPathComponent:@"rsapubkey.pem"];
}
和:
-(NSString *)derPrivateKeyPath
{
NSString *documentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [documentsFolder stringByAppendingPathComponent:@"rsaprivateKey.der"];
}
和:
#pragma mark - Signing section
-(NSData *)generateSignatureWithdataToSign :(NSData*)signableData
{
BIO *in = BIO_new_file([[self derPrivateKeyPath] cStringUsingEncoding:NSUTF8StringEncoding], "rb");
PKCS8_PRIV_KEY_INFO *p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(in,NULL);
EVP_PKEY *pkey = EVP_PKCS82PKEY(p8inf);
NSLog(@"%i", p8inf->broken);
PKCS8_PRIV_KEY_INFO_free(p8inf);
BIO_free(in);
uint8_t * cipherBuffer = NULL;
// Calculate the buffer sizes.
unsigned int cipherBufferSize = RSA_size(pkey->pkey.rsa);
unsigned int signatureLength;
// Allocate some buffer space. I don't trust calloc.
cipherBuffer = malloc(cipherBufferSize);
memset((void *)cipherBuffer, 0x0, cipherBufferSize);
unsigned char *openSSLHash = SHA1(signableData.bytes, signableData.length, NULL);
int success = RSA_sign(NID_sha1, openSSLHash, 20, cipherBuffer, &signatureLength, pkey->pkey.rsa); //pkey->pkey.rsa
if (success) NSLog(@"WIN");
NSData *signatureData = [NSData dataWithBytes:(const void*)cipherBuffer length:signatureLength];
EVP_PKEY_free(pkey);
return signatureData;
}
注意:我想从“rsaprivkey.pem”获取 DER 证书并将该 DER 写入“rsaprivateKey.der”。之后,我需要使用“rsaprivateKey.der”证书实现上面编码的签名过程...
最佳答案
最后,我找到了问题的答案。以下代码可能会帮助其他遇到类似问题的人....
-(void)generateCertificate
{
const int kBits = 1024;
const int kExp = 65537;
int keylen, keylenPub;
char *pem_key, *pem_key_pub;
RSA *rsa = RSA_generate_key(kBits, kExp, 0, 0);
EVP_PKEY *pkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, rsa);
bioPriv = BIO_new(BIO_s_mem());
//PKCS8 Encoded private Key
i2d_PKCS8PrivateKey_bio(bioPriv, pkey, NULL, NULL, 0, NULL, NULL);
keylen = BIO_pending(bioPriv);
pem_key = calloc(keylen+1, 1);
BIO_read(bioPriv, pem_key, keylen);
printf("%s", pem_key);
NSData *data = [NSData dataWithBytes:pem_key length:keylen];
[data writeToFile:[self privateKeyPathDER] atomically:YES];
//Public Key encryption and Saving
bioPub = BIO_new(BIO_s_mem());
i2d_RSA_PUBKEY_bio(bioPub, rsa);
keylenPub = BIO_pending(bioPub);
pem_key_pub = calloc(keylenPub+1, 1);
BIO_read(bioPub, pem_key_pub, keylenPub);
printf("%s", pem_key_pub);
NSData *dataPub = [NSData dataWithBytes:pem_key_pub length:keylenPub];
[dataPub writeToFile:[self publicKeyPathDER] atomically:YES];
RSA_free(rsa);
}
#pragma mark - Signing section
-(NSData *)generateSignatureWithdataToSign :(NSData*)signableData
{
//BIO *in = BIO_new_file([[self privateKeyPathDER] cStringUsingEncoding:NSUTF8StringEncoding], "rb");
PKCS8_PRIV_KEY_INFO *p8inf = d2i_PKCS8_PRIV_KEY_INFO_bio(bioPriv,NULL);
EVP_PKEY *pkey = EVP_PKCS82PKEY(p8inf);
NSLog(@"%i", p8inf->broken);
PKCS8_PRIV_KEY_INFO_free(p8inf);
BIO_free(bioPriv);
uint8_t * cipherBuffer = NULL;
// Calculate the buffer sizes.
unsigned int cipherBufferSize = RSA_size(pkey->pkey.rsa);
unsigned int signatureLength;
// Allocate some buffer space. I don't trust calloc.
cipherBuffer = malloc(cipherBufferSize);
memset((void *)cipherBuffer, 0x0, cipherBufferSize);
unsigned char *openSSLHash = SHA1(signableData.bytes, signableData.length, NULL);
int success = RSA_sign(NID_sha1, openSSLHash, 20, cipherBuffer, &signatureLength, pkey->pkey.rsa); //pkey->pkey.rsa
if (success) NSLog(@"WIN");
NSData *signatureData = [NSData dataWithBytes:(const void*)cipherBuffer length:signatureLength];
EVP_PKEY_free(pkey);
return signatureData;
}
-(NSString *)privateKeyPathDER
{
NSString *documentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [documentsFolder stringByAppendingPathComponent:@"rsaprivkey.der"];
}
-(NSString *)publicKeyPathDER
{
NSString *documentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
return [documentsFolder stringByAppendingPathComponent:@"rsapubkey.der"];
}
关于ios - 使用 OpenSSL 将 DER 编码 key 转换为 PEM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24037040/
如何从一个 PEM 中确定 SSL 证书到期日期,该 PEM 在一个文件 (pem) 上串联了很多证书? 例子: # cat cert.pem -----BEGIN CERTIFICATE-----
我想让运行测试更容易。为了实现这一点,我想提供项目内部测试中使用的 secret 。 我使用以下命令创建了“fullchain.pem”、“privkey.pem”和“dhparams.pem”: o
注意图片中证书的图标图像上写有标准或个人。有什么不同?最近一次我在处理它,我只制作了带有“个人”的图标。我不知道为什么。有什么不同?两者是如何产生的? 最佳答案 我会这样说,因为您的 .p12 文件包
我正在尝试安装这个项目:https://github.com/versatica/mediasoup-demo 它需要 fullchain.pem和 privkey.pem文件。 如何在 Ubuntu
我正在使用 curl 使用公共(public)证书文件从 https 站点下载数据。 系统信息: 操作系统:软呢帽 14 curl : curl 7.30.0 openssl: OpenSSL 1.0
我正在尝试使用 openssl 加密短文本,但我不知道如何继续。更具体地说:我发现一段代码似乎可以工作,但必须从终端执行指令。是的,我知道,存在 system() 函数,但我想避免它,因为它需要文件夹
我正在使用 OpenSSL 将“me.p12”转换为 PEM。当我生成“me.p12”时,我为其设置了密码。 “me.p12”包含私钥和证书。 当我将其转换为 PEM 时,我运行命令: openssl
我正在使用 Amazon 的 EC2 集群来运行 GraphLab。他们想要我的 .pem 文件的位置,这是我的私钥。 搜索后我仍然在ubuntu中找不到该文件。我正在使用 PuTTY。 最佳答案 .
我正在尝试了解 .pem 文件的布局方式。密码短语是如何验证的? .pem 文件如何检查您尝试打开它时使用的密码? 最佳答案 多种不同类型的数据存储在扩展名为.pem 的文件中。所以你的问题不准确。但
我需要生成一个 cert.pem 和 key.pem 文件来使用 Nginx 加密 http 请求。 在 Linux 上,我会执行以下 OpenSSL 命令: openssl req -x509 -n
我必须以 pem 格式提交 CSR。 我已经使用 OpenSSL 生成了 CSR,但在将其转换为 PEM 格式时遇到了困难。 我必须从 example.csr 获取示例 - csr.pem。如何实现?
我知道这是一个与许多其他问题非常相似的问题,但他们都没有给出直接的答案或对我有用的答案...... 我从 Let's encrypt 获得了两个文件: 证书.pem key.pem 我需要让他们进入
首先,我看过this thread但它不相关并且有不同的问题。 我的 Kafka 属性文件中有以下设置片段: ssl.keystore.type=PEM ssl.keystore.key=/path/
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this q
我想下载 Cpanel 自动生成的 SSL 作为 key.pem 和 cert.pem,我在 Cpanel 中找不到任何下载链接,有什么建议吗? 我曾尝试将证书文本复制到文本文件中并使用它,但没有成功
这个问题在这里已经有了答案: Converting pfx to pem using openssl (5 个答案) 关闭 6 年前。
我想通过 AWS Lambda 使用 pysftp 库连接 EC2。我使用以下代码进行连接。 mysftp = pysftp.Connection( host=Constants.MY_HOS
我有这两个文件(certificate.pem 和private_key.pem),它们由我使用的 API 提供。我需要使用这些文件在 Swift 项目中签署我的 http 请求。 我可以用 Post
我的 Pem 文件就是这种格式。 Bag Attributes localKeyID: friendlyName: test subject=/C=GB/ST=London/L=Soho/O=Righ
我从证书颁发机构获得了这些文件: domain.com.p7b domain.com.crt domain.com.ca-bundle 我尝试了这个小代码: var express = require
我是一名优秀的程序员,十分优秀!