Python 2.7 检查文件是否为证书或密钥

Python 2.7 检查文件是否为证书或密钥,python-2.7,ssl,openssl,ssl-certificate,private-key,Python 2.7,Ssl,Openssl,Ssl Certificate,Private Key,我有一个问题,我允许用于上载证书和私钥文件的。现在假设我有一个扩展名出错(有意或无意更改)的文件,比如说破坏了系统。。我需要设置一个验证,该验证可以检查并告诉我给定的文件是有效的证书文件或私钥文件或其他文件 我要做的是:检查文件内容中的--开始证书--,--开始RSA私钥--。。请告诉我这件事是好的,或者有其他更好的办法来解决这个问题 谢谢 检查并可以告诉我给定的文件是有效的证书文件或私钥文件 我将用C回答这个问题,因为OpenSSL是一个C库。其他人可能会把它翻译成,在这种情况下,他们可能有一

我有一个问题,我允许用于上载证书和私钥文件的。现在假设我有一个扩展名出错(有意或无意更改)的文件,比如说破坏了系统。。我需要设置一个验证,该验证可以检查并告诉我给定的文件是有效的证书文件或私钥文件或其他文件

我要做的是:检查文件内容中的
--开始证书--
--开始RSA私钥--
。。请告诉我这件事是好的,或者有其他更好的办法来解决这个问题

谢谢

检查并可以告诉我给定的文件是有效的证书文件或私钥文件

我将用C回答这个问题,因为OpenSSL是一个C库。其他人可能会把它翻译成,在这种情况下,他们可能有一个比我更好的答案

这里有两个答案。一个用于证书,第二个用于私钥。私钥首先显示,因为它用于验证证书(因此首先访问它是有意义的)

另外,调用
*\u check\u key
例程也很重要,因为OpenSSL只检查密钥是否编码良好;它不会检查它是否真的有效。例如,请参见


在OpenSSL中,您将使用以下内容验证私钥:

FILE*FILE=fopen(…);
EVP_PKEY*PKEY=PEM_read_PrivateKey(文件,NULL,密码回调,NULL);
unsigned long err=err_get_error();
如果(pkey)
免费执行副总裁(PKEY);
如果
pkey
NULL
,则出现问题,
err
保存原因码。否则,您有一个正确编码的私钥(但不一定有效)

PasswordCallback
可以简单地在缓冲区中提供密码,也可以提示用户并在缓冲区中返回密码。有关
密码回调的详细信息,请参阅

如果密钥已正确编码,则可以检查私钥的类型,并使用以下命令对其进行验证

int type=EVP\u PKEY\u get\u type(PKEY);
开关(类型)
{
案例执行副总裁(PKEY)(RSA):
案例执行副总裁2:
RSA*RSA=EVP_PKEY_get1_RSA(PKEY);
rc=RSA检查密钥(RSA);
断言(rc);
RSA_-free(RSA);
打破
案例执行副总裁
案例执行副总裁(PKEY)DSA1:
案例执行副总裁兼首席执行官
案例执行副总裁(PKEY)DSA3:
案例执行副总裁(PKEY)DSA4:
DSA*DSA=EVP_PKEY_get1_DSA(PKEY);
rc=DSA检查键(DSA);
断言(rc);
无DSA(DSA);
打破
案例执行副总裁(卫生署):
DH*DH=EVP_PKEY_get1_DH(PKEY);
rc=DH检查键(DH);
断言(rc);
DH_free(DH);
打破
案例执行副总裁:
EC_KEY*EC=EVP_PKEY_get1_EC_KEY(PKEY);
rc=EC键检查键(EC);
断言(rc);
无钥匙(EC);
打破
违约:
断言(0);
}
EVP\u PKEY\u get\u type
不是OpenSSL的一部分。我是如何实现它的:

int EVP_PKEY_get_type(EVP_PKEY*PKEY)
{
断言(pkey);
如果(!pkey)
返回NID_unde;
返回EVP_PKEY_类型(PKEY->type);
}

在OpenSSL中,您将使用以下内容验证证书:

FILE*FILE=fopen(…);
X509*X509=PEM_read_X509(文件,NULL,NULL,NULL);
unsigned long err=err_get_error();
如果
x509
NULL
,则出现问题,
err
保留原因码。否则,您将拥有正确编码的证书(但不一定有效)

然后,您可以通过以下方式验证证书:

/*请参见上文关于验证私钥的内容*/
EVP_PKEY*PKEY=ReadPrivateKey(…);
int rc=X509\u验证(X509,pkey);
err=err_get_error();
如果
rc!=1
,然后出现问题,
err
保存原因码。否则,您将拥有有效的证书和私钥对。如果证书有效,则不能使用
err
,因为
err
仅在出现问题时有效

如果您的证书由颁发者(例如CA或中间人)签名,则需要使用
X509_STORE
验证颁发者在证书上的签名(省略了大量错误检查):

const char*serverCertFilename=。。。;
常量字符*issuerCertFilename=。。。;
X509_STORE*STORE=X509_STORE_new();
断言(存储);
静态常量长标志=X509_V_标志_X509_严格| X509_V_标志_检查_签名
|X509_V_标志_政策检查;
rc=X509_存储_设置_标志(存储,标志);
err=err_get_error();
断言(rc);
/*其他一些对象/函数拥有“lookup”,但我不确定是哪个(可能是商店)*/
X509_LOOKUP*LOOKUP=X509_STORE_add_LOOKUP(STORE,X509_LOOKUP_file());
/*err=err_get_error();//不设置错误代码*/
断言(查找);
/*无法从内存加载此文件。没有API*/
rc=X509\u查找\u加载\u文件(查找,发行人证书文件名,X509\u文件类型\u PEM);
/*err=err_get_error();//不设置错误代码*/
断言(rc);
X509_STORE_CTX*CTX=X509_STORE_CTX_new();
断言(ctx);
X509*serverCert=ReadCertificate(serverCertFilename);
断言(服务器证书);
rc=X509_STORE_CTX_init(CTX,STORE,serverCert,NULL);
ret=err=err_get_error();
断言(rc);
/*错误代码在https://www.openssl.org/docs/crypto/X509_STORE_CTX_get_error.html */
rc=X509验证证书(ctx);
err=X509\u存储\u CTX\u获取\u错误(CTX);
/*执行清理,返回成功/失败*/