導航:首頁 > 編程語言 > openssl編程實例

openssl編程實例

發布時間:2023-03-25 10:41:10

A. 使用openssl 創建pkcs12 keystore 為什麼會出錯

(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是之前生成的。

附1:
下述代碼是從99bill-rsa.pfx中獲取私鑰的java版本代碼。因為private-rsa.key中生成的私鑰無法直接使用,必須進行一定的處理。
代碼有幾個注意點:
文件流初始化路徑需要根據自己的實際路徑來填寫。
密碼是在第二節中c步驟中的密碼,本實例輸入的是suning。
KeyStorekeyStore = KeyStore.getInstance("PKCS12");
= newFileInputStream("D:/OpenSSL/bin/99bill-rsa.pfx");
char[]nPassword = "suning".toCharArray();
StringkeyAlias = null;
keyStore.load(fileInputStream,nPassword);
fileInputStream.close();
System.out.println("keystoretype=" + keyStore.getType());
Enumeration<String>enumeration = keyStore.aliases();
if(enumeration.hasMoreElements())
{
keyAlias = (String) enumeration.nextElement();
System.out.println("alias=[" + keyAlias +"]");
}
System.out.println("iskey entry=" + keyStore.isKeyEntry(keyAlias));
PrivateKeyprikey = (PrivateKey) keyStore.getKey(keyAlias, nPassword);
//私鑰轉成字元串
StringprivateStr = Base64.encodeBase64String(prikey.getEncoded()).trim();
//生成公鑰字元串,還可以通過cer證書生成
Certificatecert = keyStore.getCertificate(keyAlias);
PublicKeypubkey = cert.getPublicKey();
StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();
注意:
1. 所用類的說明:
Base64:
import org.apache.commons.net.util.Base64;
Certificate:
import java.security.cert.Certificate;
2. 在openssl生成公私鑰過程中,用戶輸入了密碼。本例中密碼為suning。

1. 摘要及生成方法
摘要的生成過程(digest方法全部實現了下述3個過程):
1. 根據key對傳來的map數據排序;
2. 生成a1=b1&a2=b2&a3=b3形式的字元串,排除某些字元串Key值;
3. 調用digest方法進行md5編碼;
以上三步均通過Digest.digest()方法實現:
String digest = Digest.digest(Map<String,String> map, String... keys);
傳遞的http報文體body內容如a1=b1&a2=b2&a3=b3形式的字元串,提取出需要加簽的字元串並轉成map形式。execludeKes是要排除的欄位,是一個字元串數組。
計算摘要這一步很關鍵,因為選取的欄位要求發送方和接收方必須一致,即發送方對哪些欄位計算摘要,那麼同樣地接收方也必須對相同的欄位計算摘要,否則會報6601的錯誤。
說明:a. Map是存儲了計算摘要的欄位
b. keys表示排除的欄位,不能用於計算摘要的欄位,如signature,signAlgorithm
2. 公鑰證書及字元串轉換方法
轉換的目的:便於存儲。(商戶直接提供公鑰證書也可以,但是對於向驗簽系統提供公鑰字元串的商戶,需要用下述代碼把公鑰轉成字元串)
1. 公鑰/私鑰字元串轉成公鑰/私鑰,主要是把字元串轉成公鑰PublicKey
X509EncodedKeySpec pubKeySpec = newX509EncodedKeySpec(Base64.decodeBase64(strPubKey));
KeyFactorykeyFactory = KeyFactory.getInstance(RSA);
PublicKeypubKey = keyFactory.generatePublic(pubKeySpec);
2. 公鑰或私鑰轉成Base64字元串:
StringpublicStr = Base64.encodeBase64String(pubKey.getEncoded()).trim();
3. 公私鑰驗證方法
驗證目的:公私鑰生成之後,需要驗證是否匹配。(之前許多商戶生成公私鑰混亂,無法確定公私鑰是否匹配就添加到驗簽系統中)。此代碼由用戶自己用junit驗證運行。驗證公私鑰生成是否正確,如果result為true,則說明公私鑰生成正確;否則生成的公私鑰有問題,不能使用。
String prik1 ="";
String pubb ="";
String data ="wkk";
String digest =Digest.digest(data);
PrivateKey privateKey =RSAUtil.getPrivateKey(prik1);
String sign =RSAUtil.sign(digest, privateKey);
boolean result =RSAUtil.vertiy(digest, sign,
RSAUtil.getPublicKey(pubb));
System.out.println(result);

B. 在unbuntu下使用openssl 寫一個加密的C程序,編譯提示找不到頭文件openssl/*.h

哥門 <openssl/aes.h> 里 的openssl只是文件夾名字而已,
linux下面 /usr/local/include/ /usr/include/ 這兩個路徑是默認引用的。
所以你沒加 -I 也是可以編譯的 。
當交叉編譯時,那就完全不一樣了,必須配置好所有路徑。

C. 求用OpenSSL做的RSA文件加密程序實例,VC++6.0的,各位大俠幫幫忙,急用呀,多謝啦

#include <openssl/rsa.h>
#include <openssl/sha.h>
int main()
{
RSA *r;
int bits=1024,ret,len,flen,padding,i;
unsigned long e=RSA_3;
BIGNUM *bne;
unsigned char*key,*p;
BIO *b;
unsigned charfrom[500],to[500],out[500];

bne=BN_new();
ret=BN_set_word(bne,e);
r=RSA_new();
ret=RSA_generate_key_ex(r,bits,bne,NULL);
if(ret!=1)
{
printf("RSA_generate_key_ex err!\n");
return -1;
}
/* 私鑰i2d */

b=BIO_new(BIO_s_mem());
ret=i2d_RSAPrivateKey_bio(b,r);
key=malloc(1024);
len=BIO_read(b,key,1024);
BIO_free(b);
b=BIO_new_file("rsa.key","w");
ret=i2d_RSAPrivateKey_bio(b,r);
BIO_free(b);

/* 私鑰d2i */
/* 公鑰i2d */
/* 公鑰d2i */
/* 私鑰加密 */
flen=RSA_size(r);
printf("please select private enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("5.RSA_X931_PADDING\n");
scanf("%d",&padding);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else
{
printf("rsa not surport !\n");
return -1;
}
for(i=0;i<flen;i++)
memset(&from[i],i,1);
len=RSA_private_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_private_encrypt err!\n");
return -1;
}
len=RSA_public_decrypt(len,to,out,r,padding);
if(len<=0)
{
printf("RSA_public_decrypt err!\n");
return -1;
}
if(memcmp(from,out,flen))
{
printf("err!\n");
return -1;
}
/* */
printf("please select public enc padding : \n");
printf("1.RSA_PKCS1_PADDING\n");
printf("2.RSA_SSLV23_PADDING\n");
printf("3.RSA_NO_PADDING\n");
printf("4.RSA_PKCS1_OAEP_PADDING\n");
scanf("%d",&padding);
flen=RSA_size(r);
if(padding==RSA_PKCS1_PADDING)
flen-=11;
else if(padding==RSA_SSLV23_PADDING)
flen-=11;
else if(padding==RSA_X931_PADDING)
flen-=2;
else if(padding==RSA_NO_PADDING)
flen=flen;
else if(padding==RSA_PKCS1_OAEP_PADDING)
flen=flen-2 * SHA_DIGEST_LENGTH-2 ;
else
{
printf("rsa not surport !\n");
return -1;
}
for(i=0;i<flen;i++)
memset(&from[i],i+1,1);
len=RSA_public_encrypt(flen,from,to,r,padding);
if(len<=0)
{
printf("RSA_public_encrypt err!\n");
return -1;
}
len=RSA_private_decrypt(len,to,out,r,padding);
if(len<=0)
{
printf("RSA_private_decrypt err!\n");
return -1;
}
if(memcmp(from,out,flen))
{
printf("err!\n");
return -1;
}
printf("test ok!\n");
RSA_free(r);
return 0;
}
上述程序中當採用公鑰RSA_SSLV23_PADDING加密,用私鑰RSA_SSLV23_PADDING解密時會報錯,原因是openssl源代碼錯誤:
rsa_ssl.c函數RSA_padding_check_SSLv23有:
if (k == -1) /* err */
{
RSAerr(RSA_F_RSA_PADDING_CHECK_SSLV23,RSA_R_SSLV3_ROLLBACK_ATTACK);
return (-1);
}
修改為k!=-1即可。
各種padding對輸入數據長度的要求:
私鑰加密:
RSA_PKCS1_PADDING RSA_size-11
RSA_NO_PADDING RSA_size-0
RSA_X931_PADDING RSA_size-2
公鑰加密
RSA_PKCS1_PADDING RSA_size-11
RSA_SSLV23_PADDING RSA_size-11
RSA_X931_PADDING RSA_size-2
RSA_NO_PADDING RSA_size-0
RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-2

D. 如何給JSP伺服器Resin加上SSL認證

為最佳JSP伺服器Resin加上SSL認證
Resin主要是作為WEB伺服器的jsp/servlets運行平台。它支持許多WEB伺服器軟體,而且是完全免費的,並提供了對SUN的J2EE的支持,這要比其它相關的java和javascript開發和運行平台要好的多,而且速度非常快,並提供伺服器端直接開發、編譯和運行。因此,Resin受到了許多應用JSP的WEB站點的支持。
一、 在WEB伺服器中使用OpenSSL套件
1、安裝OpenSSL
想要Resin可以響應SSL請求,我們就必需保證WEB伺服器上已經安裝好了相關的SSL套件。對於中小企業來說,開源免費的OpenSSL提供與SSL相同的認證功能。
OpenSSL的Linux版本可以在www.openssl.org網站上下載。現在它的最新版本是OpenSSL 0.9.8j。
Resin通過它的libexec/libresinssl.so JNI庫文件提供對OpenSSL的支持。如果是在類Linux系統下使用OpenSSL,在安裝時可以通過下列命令將它安裝到指定的位置:
./configure --with-openssl=/usr/local/ssl

如果我們是在Windows系統中使用Resin,那麼,我們同樣需要在此操作系統下先安裝好OpenSSL。Windows下的OpenSSL在www.slproweb.com/procts/Win32OpenSSL.html下載,它的最新安裝文件是Win32OpenSSL-0_9_8j.exe,其大小為7MB左右。
在Windows系統下,Resin的resinssl.dll文件中包含提供對OpenSSL支持的代碼。(在Resin3.0以前的版本是通過resin.dll文件提供支持的。)因此,在Windows系統下只需要安裝好OpenSSL就可以讓Resin使用它了。OpenSSL在Windows系統下很容易安裝,就如同安裝其它的應用程序一樣簡單。
不過,在Windows系統下安裝完OpenSSL後,還應當將一些需要的DLL文件復制到Resin的根目錄當中。現在假設Resin安裝在c:\resin-3.2.1目錄,OpenSSL安裝在c:\Program Files\GnuWin32目錄。現在打開系統開始菜單的「運行」對話框,在運行框中輸入CMD命令,回車後進入命令行終端界面。然後在命令行終端下就可以通過下列所示的命令將OpenSSL安裝目錄下的相關文件復制到Resin的根目錄下:
cd resin-3.2.1
c:\Program Files\GnuWin32\bin\libssl32.dll c:\resin-3.2.1\libssl32.dll
c:\Program Files\GnuWin32\bin\libeay32.dll c:\resin-3.2.1\libeay32.dll
2、生成SSL認證私鑰
SSL認證的密鑰由OpenSSL來生成,生成後的密鑰應當保存到相應的Resin目錄中。因此,在生成密鑰前,我們可以在Resin根目錄中創建一個keys子目錄用來保存將要創建的密鑰。在類Linux系統下,我們可以通過下列方式來創建keys目錄:
cd /resin
mkdir keys
在Windows系統下,我們可以在資源管理器中直接在Resin根目錄下創建一個新文件夾,並命名為keys即可。
在生成密鑰時,OpenSSL會根據其配置文件中設置的內容來生成。在類Linux系統下,這個預設的配置文件可能在usr/ssl/openssl.cnf或/usr/share/ssl/openssl.cnf下。而Windows系統中不存在這樣的文件。
當然,我們還可以自己創建一個相應的配置文件保存到Resin/keys/目錄下。這樣,在創建密鑰時,OpenSSL也會根據這個配置文件中的內容來創建,而且,在創建密鑰時不會要求我們根據提示輸入預設的相關信息了。
下面是一個openssl.cnf配置文件的相關內容實例:
[ req ]
default_bits = 1024 #在這里填入加密鍵的預設位數
distinguished_name = req的名稱
[ req_distinguished_name ]
C = 在這里填入國家的代碼,例如CN,代表中國
C_default =
ST = 這里填寫州或省名稱
ST_default =
L = 城市
L_default =
O = 企業或機構名稱
O_default =
OU = 組織中某個部門的名稱,例如市場部
OU_default =
CN = 我們的網站域名,必需是全名,例如www.myweb.com
CN_default =
emailAddress = 聯系的E-Mail郵箱地址
emailAddress_default =
完成OpenSSL配置文件的相關設置後,我們就可以開始為SSL認證創建一個私鑰。在WEB伺服器上創建私鑰時,會要求我們輸入相應的密碼,這個密碼將會在我們使用創建的私鑰時要求被輸入。因此要牢記這個密碼並妥善地保管它。我們還必需將這個密碼加入到Resin的配置文件當中。
在類Linux系統下創建私鑰時,私鑰的文件名可以由我們自己決定,可以通過下列所示命令來完成:
openssl genrsa -des3 -out myprikey.key 1024
在Windows系統下創建私鑰。得先進入命令行終端界面,然後用CD命令切換到OpenSSL安裝目錄,再用下列命令產生私鑰;
c:\Program Files\GnuWin32\bin\openssl.exe genrsa -des3 -out myprikey.key 1024
二、 創建或申請SSL證書:
為了能夠加密與用戶的會話數據,我們還必需為SSL認證創建或申請一個公鑰證書。這個公鑰證書在使用時會由Resin發送給用戶的瀏覽器,以便瀏覽器能夠加密其發送的數據。公鑰證書可以由OPENSSL產生一個自簽名證書,也可以到第三方SSL證書頒發機構申請一個公鑰證書。要注意的是,自簽名證書將不能被其瀏覽器所承認。
1、創建一個自簽名證書
當我們只是用來測試WEB伺服器的SSL安全連接,或者只是作為企業遠程辦公之用時,那麼創建一個自簽名證書將會為我們節省一筆小錢。但是,對於這樣的自簽證書,WEB瀏覽器是不會承認的,還會為此彈出一個警告框來提醒用戶這個證書不是一個公認的SSL證書。不過,用戶瀏覽器與WEB伺服器之間的會話數據仍然是被SSL加密了的。
在類Linux系統下創建自簽名證書,可以使用下列命令來完成:
openssl req -config ./openssl.cnf -new -key myprikey.key -x509 -out myself.crt
在Windows系統下創建自簽名證書,在字元終端用CD命令進入OpenSSL安裝目錄後,可以通過下列命令完成:
c:\Program Files\GnuWin32\bin\openssl.exe req -config ./openssl.cnf -new -key myprikey.key -x509 -out myself.crt
其中,自簽名證書的名稱可以由我們自己決定,例在本例中為myself.crt,而「-key」參數後帶的鍵文件是在上面我們創建的私鑰文件,而命令中的「./openssl.cnf」表示當前目錄下的OpenSSL的配置文件。
如果我們沒有按前文所述方式生成一個OpenSSL配置文件,或者沒有修改此配置文件中的缺少配置值,那麼在創建過程中會要求我們提供一些基本的與WEB伺服器相關的身份資料,例如企業名稱和網站域名等信息。
2、創建一個證書請求文件
如果要使用第三方證書頒發機構上的證書,那麼就必需先創建一個證書請求文件(CSR)。這個證書請求文件中包含有證書的公鑰、企業名稱、加密位數、地址和網站域名等信息。
當我們在第三方證書頒發機構上申請證書時,就會要求我們提交這個證書請求文件,然後,證書頒發機構才能將SSL證書頒發給我們。現在提供SSL證書的機構有許多,例如VeriSign公司就是其中最著名的代表。在生成證書請求文件時一定要注意,我們使用什麼樣的WEB伺服器軟體,就必需生成與它相兼容的證書請求文件,這樣,SSL證書頒發機構頒發給我們的證書才能在此WEB伺服器下使用。
在Linux系統下生成證書請求文件,可以使用下列命令達到目的:
openssl req -new -config ./openssl.cnf -key myprikey.key -out myprikey.csr
在Windows系統下生成證書請求文件,在命令行界面中通過CD命令進入OpenSSL安裝目錄後,通過下列命令來完成證書請求文件的生成:
c:\Program Files\GnuWin32\bin\openssl.exe req -new -config ./openssl.cnf -key myprikey.key –out myprikey.csr
證書請求文件的文件名可以由我們自己來決定,在本文中為myprikey.csr。在生成證書請求文件過程中會要求我們輸入一些與WEB伺服器身份相關的信息,例如網站域名和企業名稱等。我們必需按要求如實填寫。
當我們成功注冊,並支付相應的年使用費之後,這些證書頒發機構就會將SSL證書發送到我們填寫的電子郵箱當中。
三、 配置Resin使用私鑰和SSL證書
要想Resin能夠使用SSL認證,我們還必需對其配置文件resin.conf做相應的設置。具體要配置的內容包括:
...

keys/ myself.crt
keys/ myprikey.key
mypassword

其中,中的內容表示SSL連接使用的默認埠號,如果沒有特別要求,可以保持默認。和之間的內容填入Resin可以使用的SSL認證公鑰,在這里為myself.crt。和之間的內容填入Resin可以使用的私鑰,在本文中為myprikey.key。至於和之間就是填入我們在創建私鑰時設置的密碼。
四、 測試Resin的SSL加密連接
當我們配置好Resin的SSL認證後,我們還可以通過一些方式來檢驗我們的配置是否正確。
在Windows系統下,我們就可以通過在WEB瀏覽器地址欄中輸入https://URL(企業網站的域名)的方式,來驗證WEB伺服器是否對這樣的URL地址做出正確響應。如果返回正常的內容,並且在WEB瀏覽器地址欄中顯示出一個掛鎖的標志,那麼,Resin的SSL配置就算成功了。
在Linux系統下,除了可以上述方式來檢驗外,還可以通過下列方式來驗證:
openssl s_client -connect www.myweb.com:443 –prexit
另外,我們還可以通過下列的JSP腳本來快速驗證Resin是否對SSL做出反應:
Secure? <%= request.isSecure() %>
經過上述的檢驗操作後,如果都能得到WEB伺服器的正確響應,那麼就說明Resin已經能夠提供對SSL技術的支持了。
也就是說,當用戶通過WEB瀏覽器向WEB伺服器發送一個SSL請求時,Resin就會為這個WEB瀏覽器提供SSL認證的公共密鑰,然後,這個WEB瀏覽器就可以使用這個公共密鑰來加密數據,而Resin將使用WEB伺服器的SSL私鑰對加密的數據進行解密。

閱讀全文

與openssl編程實例相關的資料

熱點內容
為什麼我的世界天空伺服器進不去 瀏覽:260
釘釘直播後的視頻如何線上加密 瀏覽:501
聽主的命令 瀏覽:206
全民上雲時代雲伺服器 瀏覽:519
iphone不創建id如何下載app 瀏覽:970
windowsphp擴展安裝 瀏覽:93
emacslinux配置文件 瀏覽:379
python3在線教程 瀏覽:114
不小心刪文件夾的文件 瀏覽:480
java獲取手機IP 瀏覽:816
手機rar解壓密碼獲取 瀏覽:344
程序員被辭退工資怎麼處理 瀏覽:494
戀活的模型沒加密 瀏覽:159
如何把安卓機的微信轉移蘋果 瀏覽:583
爬山演算法相關題目 瀏覽:724
vc編程大全 瀏覽:118
excel表格單列數據加密 瀏覽:649
給同事的解壓話語 瀏覽:993
linux關閉網卡命令行 瀏覽:455
史上最漂亮程序員 瀏覽:771