❶ linux下使用openssl檢測PE文件數字簽名的證書是否有效
第一個坑: 有效期
windows在判斷證書是否有效時不檢測證書的有效期, 即使該證書超過有效期好幾年了, 只要沒有被吊銷, 微軟仍然認為它是有效的. 但在 openssl 提供的 X509_verify_cert 函數會驗證證書的有效期, 因此需要注釋掉驗證有效期的那部分代碼並重新編譯 openssl...
OK, 從 openssl 官網 上下載最新的版本, 好吧, 現在還是剛剛修復 Heartbleed 漏洞的 1.0.1g 版本...
下載, 解壓, 看下 INSTALL 文檔, 先試試可以編譯不:
./config
make
運氣不錯, 不用安裝什麼依賴直接編譯成功. 將代碼根目錄產生的 libcrypto.a 添加到項目中測試下, OK, 可以使用, 下面開始折騰了~
在 crypto/x509/x509_vfy.c 的 153 行找到 X509_verify_cert 函數(在線查看), 局部變數 ok 緩存每一步驗證是否通過, 它依次調用了:
check_issued
check_chain_extensions
check_name_constraints
check_trust
check_revocation
internal_verify
check_policy
其中 internal_verify (在線查看)驗證了證書的有效期, 進入這個函數, 在 1654 行找到這個代碼:
ok = check_cert_time(ctx, xs);
if (!ok)
goto end;
看看 check_cert_time 函數, 確認是檢查 notBefore 和 notAfter, 因此將上面三行代碼注釋掉, 驗證證書時就不會檢測有效期了.
然後就是重新編譯 openssl, 將 libcrypto.a 集成到項目里了~
第二個坑: unhandled critical extension
搜索了下, 在 openssl 官網上找到這個:
-ignore_critical
Normally if an unhandled critical extension is present which is not supported by OpenSSL the certificate is rejected (as required by RFC5280). If this option is set critical extensions are ignored.
原來是當openssl遇到證書中有它不支持的 未處理的關鍵擴展(unhandled critical extension ?) 時, 它會拒絕載入該證書.
再搜索下 -ignore_critical, 在 verify.c 中找到如下代碼片段:
else if (strcmp(*argv,"-ignore_critical") == 0)
vflags |= X509_V_FLAG_IGNORE_CRITICAL;
然後再使用 X509_STORE_set_flags 函數設置標志位:
X509_STORE *ctx;
...
X509_STORE_set_flags(ctx, vflags);
即可.
第三個坑: certificate signature failure
這個坑填不上了, openssl 說:
7 X509_V_ERR_CERT_SIGNATURE_FAILURE: certificate signature failure
the signature of the certificate is invalid.
在windows下導出證書文件, 直接用 openssl 驗證, 在載入證書就會出錯, PEM_read_bio_X509 返回為空....
第四個坑: A certificate was explicitly revoked by its issuer.
A certificate was explicitly revoked by its issuer. 是 Sysinternals 提供的工具sigcheck.exe 的檢測結果, 把文件拎出來一看, 證書真的被撤銷了...
OK, 只好根據證書上的 CRL Distribution Point(CRL 分發點) 提供的 URL 下載 撤銷證書列表 文件, 然後在調用 X509_verify_cert 驗證證書鏈之前, 設置填充被撤銷的證書列表:
X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl); // 讀取被撤銷的證書列表
STACK_OF(X509_CRL) *sk_X509_CRL_new_null();
#define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)); // sk_X509_CRL_push(STACK_OF(X509_CRL) *crls, X509_CRL *crl);
void X509_STORE_CTX_set0_crls(X509_STORE_CTX *c, STACK_OF(X509_CRL) *sk); // 設置被撤銷的證書列表
同時, 也要設置檢查被撤銷證書列表的標志位 X509_V_FLAG_CRL_CHECK, 然後再調用X509_verify_cert 驗證證書鏈即可.
填了第四個坑後又引起了第五個坑(如何獲取撤銷證書列表)和第六個坑(設置檢測撤銷證書列表的標識位後, 如果該證書沒有撤銷證書列表則直接報錯)...
第五個坑: 獲取撤銷證書列表文件
證書上的 CRL Distribution Point(CRL 分發點) 屬於擴展屬性, 在 PKCS #7: Cryptographic Message Syntax V1.5 上沒有相關介紹.
在 StackOverflow 上找到這個問答 Openssl - How to check if a certificate is revoked or not, 其中第二個回答說 CRL 是在 RFC 5280 中定義的, 除了證書中附帶被撤銷的證書列表以外還有使用 OCSP 協議的, 即使證書撤銷列表也分為使用 URL分發點和 LDAP DNs(???)提供的, 目前先考慮使用 URL 作為 CRL分發點 的情況吧.
然而 openssl 沒有提供直接獲取 CRL 分發點 URL 的API, 那個回答說 Apache 的 mod_ssl 模塊有本地 CRL 和 OCSP 檢測的實現代碼, 但沒有說明哪裡有檢測使用 URL 作為 CRL分發點 的實現方法.
然後又在 frank4dd.com上找到這個代碼 certextensions.c, 他給出了一個如何使用 openssl 從 X.509v3 版本的證書文件中提取擴展內容的示常式序, 太感謝 Frank4DD 這位仁兄了~~~
到這里後, 可以直接使用他的示常式序, 根據關鍵字 Full Name 和 URI 定位 CRL 分發點 的 URL, 也可以看看 openssl 是如何提取這個 URL 的, 然後自己實現一個介面.
如果自作孽使用第二種方法的話, 就編譯個 debug 版的 openssl 庫, 然後調試跟進X509V3_EXT_print 函數, 一步一步的向下走, 直到走到 GENERAL_NAME_print 函數, 這里就是終點了...然後就知道了 CRL 分發點 的 URL 的編號為 6, 也就是 GEN_URI, 直接取結果吧.
第六個坑: CRL有效期
在windows環境下每次查看PE文件的數字簽名時, windows 都會從 CRL分發點 下載吊銷證書列表做驗證,一般來說, 每個 CRL的有效期是非常短的,大概只有5~20 天的有效期吧, 然而我們不可能像 windows 一樣每次查看數字簽名時就從CRL分發點下載最新的吊銷列表.
另外, windows 遇到過期的 CRL 時不會產生證書鏈無效的結果, 但 openssl 在遇到過期的 CRL 時就會導致證書鏈驗證失敗, 因此在載入和驗證 CRL 時, 要忽略 CRL 的有效期.
分析 openssl 源代碼, X509_verify_cert 調用 check_revocation , 之後調用 check_cert , 然後再調用 check_crl , 在這個函數里有檢測 CRL 有效期的代碼:
if (!(ctx->current_crl_score & CRL_SCORE_TIME))
{
ok = check_crl_time(ctx, crl, 1);
if (!ok)
goto err;
}
將其注釋掉即可忽略檢測 CRL 有效期.
第七個坑: CRL 列表為空導致 openssl 認為沒有載入 CRL
9 初始化順序
10 證書名: key_id
❷ openssl怎樣創建個人證書
一:生成CA證書
目前不使用第三方權威機構的CA來認證,自己充當CA的角色。
網上下載一個openssl軟體
1. 創建私鑰 :
C:/OpenSSL/bin>openssl genrsa -out ca/ca-key.pem 1024
2.創建證書請求 :
C:/OpenSSL/bin>openssl req -new -out ca/ca-req.csr -key ca/ca-key.pem
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:zhejiang
Locality Name (eg, city) []:hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:root
Email Address []:sky
3.自簽署證書 :
C:/OpenSSL/bin>openssl x509 -req -in ca/ca-req.csr -out ca/ca-cert.pem -signkey ca/ca-key.pem -days 3650
4.將證書導出成瀏覽器支持的.p12格式 : (不需要可以省略)
C:/OpenSSL/bin>openssl pkcs12 -export -clcerts -in ca/ca-cert.pem -inkey ca/ca-key.pem -out ca/ca.p12
密碼:changeit
二.生成server證書。
1.創建私鑰 :
C:/OpenSSL/bin>openssl genrsa -out server/server-key.pem 1024
2.創建證書請求 :
C:/OpenSSL/bin>openssl req -new -out server/server-req.csr -key server/server-key.pem
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:zhejiang
Locality Name (eg, city) []:hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:192.168.1.246 注釋:一定要寫伺服器所在的ip地址
Email Address []:sky
3.自簽署證書 :
C:/OpenSSL/bin>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey server/server-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650
4.將證書導出成瀏覽器支持的.p12格式 :
C:/OpenSSL/bin>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey server/server-key.pem -out server/server.p12
密碼:changeit
三.生成client證書。
1.創建私鑰 :
C:/OpenSSL/bin>openssl genrsa -out client/client-key.pem 1024
2009-7-17 22:32 回復
yakeqin
1位粉絲
2樓
2.創建證書請求 :
C:/OpenSSL/bin>openssl req -new -out client/client-req.csr -key client/client-key.pem
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:zhejiang
Locality Name (eg, city) []:hangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:skyvision
Organizational Unit Name (eg, section) []:test
Common Name (eg, YOUR name) []:sky
Email Address []:sky 注釋:就是登入中心的用戶(本來用戶名應該是Common Name,但是中山公安的不知道為什麼使用的Email Address,其他版本沒有測試)
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:tsing
3.自簽署證書 :
C:/OpenSSL/bin>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ca/ca-cert.pem -CAkey ca/ca-key.pem -CAcreateserial -days 3650
4.將證書導出成瀏覽器支持的.p12格式 :
C:/OpenSSL/bin>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12
密碼:changeit
四.根據ca證書生成jks文件
C:/Java/jdk1.5.0_09/bin > keytool -keystore C:/openssl/bin/jks/truststore.jks -keypass 222222 -storepass 222222 -alias ca -import -trustcacerts -file C:/openssl/bin/ca/ca-cert.pem
五.配置tomcat ssl
修改conf/server.xml。tomcat6中多了SSLEnabled="true"屬性。keystorefile, truststorefile設置為你正確的相關路徑
xml 代碼
tomcat 5.5的配置:
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="server.p12" keystorePass="changeit" keystoreType="PKCS12"
truststoreFile="truststore.jks" truststorePass="222222" truststoreType="JKS" />
tomcat6.0的配置:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="server.p12" keystorePass="changeit" keystoreType="PKCS12"
truststoreFile="truststore.jks" truststorePass="222222" truststoreType="JKS"/>
六.導入證書
將ca.p12,client.p12分別導入到IE中去(打開IE->;Internet選項->內容->證書)。
ca.p12導入至受信任的根證書頒發機構,client.p12導入至個人
七.驗證ssl配置是否正確訪問你的應用http://ip:8443/,如果配置正確的話會出現請求你數字證書的對話框。
❸ openssl數字證書驗證報錯,用戶說該證書沒有
請檢查證書信息是否錄入准確,如無錯誤請重新安裝驅動,如果仍有問題可能是因為在安裝驅動程序時,電腦上安裝的殺毒或防火牆將驅動程序的某些組件屏蔽導致驅動程序安裝失敗,請暫時關閉殺毒和防火牆重新安裝驅動程序。
當本地時間不在證書有效期范圍內時,查看證書會顯示【證書已過期或未生效】。如果該證書有效,說明本地時間不準,調整為最新時間即可。
❹ openssl什麼命令是驗證證書請求
如果你想創建不是1年有效期的自簽名證書,或想提供有關自己的額外信息,你可以用一個工具Open SSL來創建證書,而不是SDK隨帶的標准工具:MakeKeys。 下面的命令,基於這里給出的建議
❺ 用openssl配置證書雙向認證,建立雙向認證時,為什麼客戶端驗證時需要安裝二級ca證書
請問二級證書怎麼載入呢?openssl怎麼生成證書鏈呢?我也遇到這個問題了。。。崩潰
❻ 用openssl驗證證書和私鑰是否有效
證書與私鑰是否有效驗證,可以在線驗證:網頁鏈接
SSL證書簽發與續費辦理:網頁鏈接
❼ openssl 怎麼驗證私鑰匹配證書
證書私鑰是否匹配驗證,可以淘寶:Gworg 尋求簽發機構驗證准確。
❽ openssl訪問https,怎麼獲取證書
1、獲取SSL證書,准備域名。
2、淘寶:Gworg獲取HTTPS證書。
3、拿到證書後,根據伺服器環境安裝。
4、APACHE安裝SSL證書:網頁鏈接
5、Nginx安裝SSL證書:網頁鏈接
6、如果看不到安裝教程,直接叫Gworg代理安裝。
❾ 如何使用OpenSSL創建證書
(1)Openssl生成公私鑰
使用Openssl是為了生成公鑰和私鑰對,用於外部商戶系統和xxx系統之間報文的安全性驗證。如果使用者不需要生成公私鑰,而是直接對報文進行處理,則參考第四部分,計算摘要及簽名值。
1. 安裝openssl步驟直接點擊exe文件。出現需要安裝vs2008插件的,直接忽略。
2. 在安裝過程中找到OpenSSL相應的安裝目錄,進入bin目錄下找到openssl.exe可執行文件,點擊運行。然後分別按順序輸入如下命令:
a. genrsa –out private-rsa.key 1024
說明:該命令是生成一個沒有加密的私鑰
genrsa 生成私鑰文件,私鑰存儲在private-rsa.key中,長度為1024。out後面指定輸出文件名。
private-rsa.key 為生成的私鑰文件,但該文件必須經過處理得到私鑰。
b. req –new –x509 –key private-rsa.key –days 750 –outpublic-rsa.cer
說明:根據private-rsa.key生成證書public-rsa.cer
-new 表示新的請求
-509 表示輸出的證書結構
750表示證書有效天數
-out public-rsa.cer -out後面表示公鑰證書,用於驗證數字簽名,此公鑰證書或者公鑰需要提前發送給需要驗證本單位或部門數據的接收方。
c. pkcs12 –export –name test-alias –in public-rsa.cer–inkey private-rsa.key –out 99bill-rsa.pfx
說明:生成PKCS12 格式Keystore
密碼前後輸入要一致,這個密碼在用Keystore生成公私鑰過程中會用到。
Public-rsa.cer, private-rsa.key是之前生成的。