- 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/
查看“mysqldump -d”并看到一个键是 KEY,而不是“PRIMARY KEY”或“FOREIGN KEY” 什么是关键? 示例: CREATE TABLE IF NOT EXISTS `TA
在我开始使用 Python 的过程中尝试找出最佳编码实践。我用 Pandas 写了一个 csv 到数据框阅读器。它使用格式: dataframe = read_csv(csv_input, useco
在 Flutter 中,用一个例子可以清楚地解释什么? 我的困惑是关于 key,如下面的代码所示。 MyHomepage({Key key, this.title}) : super(key: key
我在我的 Android 应用程序中使用 GCM。要使用 GCM 服务,我们需要创建 Google API key 。因此,我为 android、服务器和浏览器 key 创建了 API key 。似乎
我想在 azure key 保管库中创建一个 secret ,该 key 将具有多个 key (例如 JSON)。 例如- { "storageAccountKey":"XXXXX", "Co
尝试通过带有 encodeforURL() 的 url 发送 key 时,我不断收到错误消息和 decodefromUrl() .代码示例如下。 这是我的入口页面: key = generateSec
是否有检查雪花变体字段中是否存在键的函数? 最佳答案 您可以使用 IS_NULL_VALUE 来查看 key 是否存在。如果键不存在,则结果将为 NULL。如果键存在,如果值为 JSON null,则
我正在尝试运行此命令: sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A 但我收到一个错误: Execu
我有一个 csv 文件,我正在尝试对 row[3] 进行计数,然后将其与 row[0] 连接 row[0] row[3] 'A01' 'a' 'B02'
如何编写具有这种形式的函数: A(key, B(key, C(key, ValFactory(key)))) 其中 A、B 和 C 具有此签名: TResult GetOrAdd(string key
审查 this method我很好奇为什么它使用 Object.keys(this).map(key => (this as any)[key])? 只调用 Object.keys(this).ind
我有一个奇怪的情况。我有一个字典,self.containing_dict。使用调试器,我看到了字典的内容,并且可以看到 self 是其中的一个键。但是看看这个: >>> self in self.c
我需要在我的 Google Apps 脚本中使用 RSA-SHA256 和公钥签署消息。 我正在尝试使用 Utilities.computeRsaSha256Signature(value, key)
我是 React 的初学者开发人员,几天前我看到了一些我不理解的有趣语法。 View组件上有{...{key}},我会写成 key={key} ,它完全一样吗?你有链接或解释吗? render()
代理 key 、合成 key 和人工 key 之间有什么区别吗? 我不清楚确切的区别。 最佳答案 代理键、合成键和人工键是同义词。技术关键是另一个。它们都表示“没有商业意义的主键”。它们不同于具有超出
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
我正在寻找 Perl 警告的解决方案 “引用键是实验性的” 我从这样的代码中得到这个: foreach my $f (keys($normal{$nuc}{$e})) {#x, y, and z 我在
我正在为 HSM 实现 JCE 提供程序 JCE中有没有机制指定 key 生成类型例如: session key 或永久 key KeyGenerator keygen = KeyGener
我在 Facebook 上创建了一个应用程序。我已经正确添加了 keyhash 并且应用程序运行良好但是当我今天来并尝试再次运行它时它给了我这个错误。 这已经是第二次了。 Previsouly 当我收
我是一名优秀的程序员,十分优秀!