我正在设置私有CA,我想使用PHP与它进行交互。我尝试过使用PHP built-in openssl library。所以我创建了一个CSR,并使用openssl_csr_sign
进行签名。
这确实签署了CSR,但就是这样。在OpenSSL的CLI中,它将类似于
openssl x509 -req -days 360 -in file.csr -CA ca.crt -CAkey ca.key ...
虽然我想要像
这样的东西 openssl ca -cert ca.crt -keyfile ca.key -in file.csr -out file.crt ...
基本上它使用x509模块对其进行签名,而不是ca模块。因此,它不会将其写入openssl.cnf
中指定的数据库,它不会使用或更新序列号;它更多"我相信这个人所以我用我的私钥签署他的公钥"而不是实际的CA.有没有办法在PHP中管理私有CA,是否使用openssl?
答案 0 :(得分:2)
是和否。
尽管使用了提供的openssl.conf文件,但PHP的OpenSSL扩展不会自动管理证书数据库和/或序列号,并且它不提供任何实用程序来帮助解决这个问题。
另一方面,数据库本身有relatively simple format,因此您可以使用原始文件系统函数自己实现它。如果你真的采用这条路线,这里有一些提示:
fgets()
在解析时会很方便。
fscanf()
乍一看看起来更好,但它会将所有空格都视为相同而且标签是格式的重要组成部分,所以...... file()
更容易,但仅限于阅读。您可能需要同时读取和写入,并且您需要获取文件锁定以避免竞争条件。$serial = hexdec(file_get_contents($pathToSerial))
,将该变量传递给openssl_csr_sign()
,然后将sprintf("%X\n", $serial + 1)
写入该文件。 <filename>.old
,然后创建一个全新的<filename>
。这意味着,只要您使用CLI工具,任何文件系统所有权,允许您的PHP脚本访问它的权限都将丢失。
chown
,chmod
说明)以通知您。resource
(应在使用后关闭)。为了抛出异常并仅在必要时关闭资源,我喜欢预先定义保存它们的变量,并在一个闭包中预先定义use
它们,以便在抛出异常之前处理所有无条件资源的例程。正如你所看到的,如果你知道自己在做什么,它是可以管理的,但它有很多陷阱,对于一个简单的PoC来说并不值得。通过exec()
(和兄弟姐妹)调用CLI工具是一个更简单的选择。