使用备用加密密钥对CSR进行签名

时间:2017-08-04 09:23:57

标签: openssl gnupg

我有一个PEM编码的RSA私钥,用OpenSSL以外的东西加密。我想用它签署CSR。但是,这需要我先解密它。但是,作为" openssl x509 -req"的-signkey参数;拿一个文件,首先必须解密加密的密钥。

有没有办法避免先将解密密钥写入磁盘?我无法做到。

1 个答案:

答案 0 :(得分:1)

是的,你只需要使用一个带有进程替换的shell:例如zsh或bash,在Unix / Linux或Windows(cygwin)上。

使用这样的shell,您可以使用以下语法,对于一些通常应该是文件名的参数:

<(my_program_or_shell_command)

这样,shell创建一个命名管道,并用该管道的文件名替换该参数。从my_program_or_shell_command的输出中读取此伪文件的内容。

例如,您可以通过这种方式显示当前日期(本答案中的每个示例都适用于带有cygwin的Windows - 这可以在Unix / Linux上以相同的方式完成,语法相同,但命名管道不会出现相同的格式):

% cat <(date)
sam.  5 août 2017 01:33:06

要了解其工作原理,请使用echo显示命令行参数:

% echo <(date)
/dev/fd/63

如您所见,命令echo将文件名视为第一个参数。但这不是一个真实的文件。我们使用ls代替echo来显示文件类型:

% ls -l <(date)
lrwxrwxrwx 1 fenyo None 0  5 août  01:34 /dev/fd/63 -> pipe:[400]

所以,这是一个命名管道。

因此,我们现在可以回答您的问题:

  

有没有办法避免先将解密密钥写入磁盘?

是。让我们假设:

  • PEM编码的私钥一旦加密,就会命名为private-key.pem.crypt
  • 可以解密此文件的程序或命令行是my_personal_decrypt_program -myoption private-key.pem.crypt
  • 此程序或命令行将解密的内容写入其标准输出

您现在可以启动:

openssl req -new [...] -signkey <(my_personal_decrypt_program -myoption private-key.pem.crypt)

这样,openssl会在-signkey之后看到一个文件名,但它不是真正的文件,而是一个管道,其内容是my_personal_decrypt_program -myoption value的输出。因此,没有任何内容写入持久存储,例如基于磁盘的文件系统。一切都在内存中完成(内核内存和用户内存)。

最后,请注意,在某些情况下,即使在持久存储上的文件中没有任何秘密,openssl进程(将您的私钥存储在其用户区内存中,以便能够计算CSR)可以在交换分区上交换。例如,这样,在缺少内存的情况下,可以将私钥写入交换。因此,如果您希望获得非常高的安全性,请避免使用任何类型的分页或交换设备。

即使没有交换openssl进程,在具有可交换内核的系统上管道内容(临时存储在内核内存中)也可能出现相同的安全漏洞(Linux和* BSD内核不可交换) ,这些操作系统没问题)。这是避免内核内存交换的另一个好理由(例如,Windows可以交换其内核的某些部分,在其所谓的pagefile =&gt;中禁用此功能以获得对系统的高度信任)。