嗨,我正在编写一个程序,从一个.pem文件导入私钥,并创建一个私钥对象,以便以后使用它.我遇到的问题是一些pem文件头开头
-----BEGIN PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
而其他人开始
-----BEGIN RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
通过我的搜索我知道第一个PKCS#8格式化,但我不知道另一个格式是什么格式.
我的问题是如何在Windows中使用OpenSSL创建公钥和私钥,以及如何将创建的公钥放在.crt文件中,将私有密钥放在.pcks8文件中,以便使用这两个密钥在Java中签署SAML断言
提前致谢
我对 OpenSSL 相当陌生,我当前的工作任务是将项目的代码从 OpenSSL 1.1.1 更新到 OpenSSL 3.0,但我遇到了一个非常奇怪的问题。
我正在尝试根据给定的原始数据、转换为 BIGNUM 的精确二进制模数和指数创建 RSA 密钥。我尝试按照手册中的描述进行操作,并且密钥创建工作正常,但问题是我尝试使用该密钥(或基于它的 CTX)执行的任何操作都会失败,无论是签名解密还是验证。
这是我创建密钥的代码:
/* function set up above */
ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL);
if ( ctx == NULL) {
ERROR("Error: failed to initialize CTX from name.\n");
goto OPENSSL_ERROR;
}
modulus = BN_bin2bn(pubkey->data, pubkey->size, NULL);
exponent = BN_bin2bn(exp_arr, 3, NULL);
if ( modulus == NULL || exponent == NULL ) {
goto OPENSSL_ERROR;
}
OSSL_PARAM params[] = {
OSSL_PARAM_BN("n", &modulus, BN_num_bytes(modulus)*8),
OSSL_PARAM_BN("e", &exponent, BN_num_bytes(exponent)*8),
OSSL_PARAM_BN("d", NULL, 0),
OSSL_PARAM_END …Run Code Online (Sandbox Code Playgroud) 我有一些证书文件,即.key文件,其中说:
-----BEGIN RSA PRIVATE KEY-----
IEpAIBAAKCAQEAwAwxt4edIh3UuK8r5
....blablabla..................
QSNoquaasdsaKDybrezemVqCxsQjg==
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
因此,这是RSA私钥。
我曾经从这样的文件加载它们:
@private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file))
Run Code Online (Sandbox Code Playgroud)
但是,由于我使用的是Heroku,所以我打算将证书另存为它们在环境变量中的值。
所以我将它们粘贴到了我的.env文件中
COMPANY_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKC.....\n-----END RSA PRIVATE KEY-----"
Run Code Online (Sandbox Code Playgroud)
是的,我在Heroku中基于多行配置变量切换了\nfor显式。所以现在我的代码看起来像这样:\\n
@private_key = OpenSSL::PKey::RSA.new(ENV['COMPANY_KEY'])
Run Code Online (Sandbox Code Playgroud)
而且,如果我从控制台运行它,则会得到构建的对象。但是,如果我尝试从Web服务器(基于Rails 4.2.6的Puma 3.4.0,Ruby 2.2.3)运行它,它会惨不忍睹:Neither PUB key nor PRIV key:: nested asn1 error在尝试运行同一行时。
如果我使用调试控制台,则可以看到读取的文件看起来像
"Line 1\\nLine3\\nLinea3"这样……
我很确定这与文件格式有关,但是我全都没有想法,如果遇到像我这样的问题,也许可以帮上忙。
我使用以下命令创建了 RSA 私钥:
openssl genrsa -out keypair.pem 2048
Run Code Online (Sandbox Code Playgroud)
我必须在该项目中使用 DER 编码的密钥 (PKCS#1),因此我从这个 PEM 编码的私钥文件生成了两个 DER 文件 - 一个包含私钥,另一个包含公钥。
openssl rsa -inform PEM -in keypair.pem -outform DER -pubout -out public.der
openssl rsa -inform PEM -in keypair.pem -outform DER -out private.der
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我将这两个文件的内容加载到 char* 变量中。
以下均未按预期工作:
d2i_RSA_PUBKEY(NULL, &public_key_bytes, public_key_length);
d2i_RSAPublicKey(NULL, &public_key_bytes, public_key_length);
d2i_RSAPrivateKey(NULL, &private_key_bytes, private_key_length);
Run Code Online (Sandbox Code Playgroud)
我知道这一点,因为他们都回来了null。我还尝试了以下方法:
RSA * rsa = RSA_new();
d2i_RSA_PUBKEY(&rsa, &public_key_bytes, public_key_length);
RSA * rsa = RSA_new();
d2i_RSAPublicKey(&rsa, &public_key_bytes, public_key_length);
RSA * rsa = RSA_new();
d2i_RSAPrivateKey(&rsa, &private_key_bytes, private_key_length);
Run Code Online (Sandbox Code Playgroud)
皆归 …