1. 程式人生 > >openssl 程式設計。 證書製作

openssl 程式設計。 證書製作

一、openssl證書製作:

1、建立目錄./demoCA/ ./demoCA/newcerts/,建立檔案 ./demoCA/index.txt ./demoCA/serial。

2、執行echo 01 > ./demoCA/serial

3、製作自己的CA證書

$openssl req -new -x509 -keyout ca.key -out ca.crt

4、生成服務端的私鑰(key檔案)及csr檔案

$openssl genrsa -des3 -out server.key 1024

$openssl req -new -key server.key -out server.csr

5、生成客戶端的私鑰(key檔案)及csr檔案

$openssl genrsa -des3 -out client.key 1024

$openssl req -new -key client.key -out client.csr

6、用生成的CA的證書為剛才生成的server.csr,client.csr檔案簽名

$openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

$openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

7、生成pem格式證書

有時需要用到pem格式的證書,可以用以下方式合併證書檔案(crt)和私鑰檔案(key)來生成

$cat client.crt client.key> client.pem

$cat server.crt server.key > server.pem

二、openssl程式設計

      openssl的程式設計有兩種風格:原生態的和層層封裝的。

2.1原生態openssl程式設計

      需要使用BSD socket和openssl中的較底層的API。原生態openssl有兩個比較重要的結構SSL和SSL_CTX。

      SSL_CTX資料結構是用與建立SSL/TSL連線的結構,可用於指定通訊協議(SSLv23/TSLv1)、證書、金鑰等相關資訊。

      SSL資料結構是和具體會話相關聯的結構。

常用函式:

      SSL_library_init():初始化一個openssl庫。

   SSL_CTX_new(const SSL_METHOD *method):建立一個CTX結構。
   SSL_new(SSL_CTX *ctx):建立一個SSL結構。
   SSL_set_fd(SSL *ssl, int fd):把ssl結構和具體會話相關聯。
   SSL_accept(SSL *ssl)、SSL_connect(SSL *ssl):用於SSL會話握手。
   SSL_read(SSL *ssl, void *buf, int num)和SSL_write(SSL *ssl, void *buf, int num)用於SSL讀寫。
   SSL_shutdown(SSL *ssl)用於關閉一個SSL/TSL會話。
   使用這些函式就可以進行最基本的openssl程式設計了。Openssl程式設計框架如下。
   程式碼示例:HTTPS伺服器和客戶端
   伺服器端:
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <sys/un.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <arpa/inet.h>
  7. #include <openssl/bio.h>
  8. #include <openssl/ssl.h>
  9. #include <openssl/err.h>
  10. #define SERVER_PEM "../digitCert/server.pem"
  11. #define SERVER_KRY "../digitCert/server.key"
  12. int password_callback(char *buf, int size, int rwflag, void *userdata)  
  13. {  
  14.     /* For the purposes of this demonstration, the password is "ibmdw" */
  15.     printf("*** Callback function called/n");  
  16.     strcpy(buf,"123456");  
  17.     return strlen(buf);  
  18. }  
  19. int main()  
  20. {  
  21.     int serv_sock,cli_sock;  
  22.     socklen_t client_len;  
  23.     struct sockaddr_in server_address;  
  24.     struct sockaddr_in client_address;  
  25.     SSL_CTX * ctx;  
  26.     SSL *ssl;  
  27.     int (*callback)(char *, intintvoid *) = &password_callback;  
  28.     printf("Serving it up in a secure manner/n/n");  
  29.     SSL_library_init();  
  30.     SSL_load_error_strings();  
  31.     ERR_load_BIO_strings();  
  32.     ERR_load_SSL_strings();  
  33.     OpenSSL_add_all_algorithms();  
  34.     printf("Attempting to create SSL context... ");  
  35.     ctx = SSL_CTX_new(SSLv23_server_method());  
  36.     if(ctx == NULL)  
  37.     {  
  38.         printf("Failed. Aborting./n");  
  39.         return 0;  
  40.     }  
  41.     printf("/nLoading certificates.../n");  
  42.     SSL_CTX_set_default_passwd_cb(ctx, callback);  
  43.     if(!SSL_CTX_use_certificate_file(ctx, SERVER_PEM, SSL_FILETYPE_PEM))  
  44.     {  
  45.         ERR_print_errors_fp(stdout);  
  46.         SSL_CTX_free(ctx);  
  47.         return 0;  
  48.     }  
  49.     else printf("load server.csr successful!/n");  
  50.     if((SSL_CTX_use_PrivateKey_file(ctx, SERVER_KRY, SSL_FILETYPE_PEM))<=0)  
  51.     {  
  52.         printf("use private key failed!/n/n");  
  53.         ERR_print_errors_fp(stdout);  
  54.         SSL_CTX_free(ctx);  
  55.         return 0;  
  56.     }  
  57.     serv_sock = socket(AF_INET,SOCK_STREAM,0);  
  58.     if(-1 == serv_sock){  
  59.         perror("socket");  
  60.     }  
  61.     server_address.sin_family = AF_INET;  
  62.     server_address.sin_port = htons(443);  
  63.     server_address.sin_addr.s_addr = htonl(INADDR_ANY);  
  64.     int ret = bind(serv_sock,(struct sockaddr*)&server_address,sizeof(struct sockaddr));  
  65.     if(-1 == ret){  
  66.         perror("bind");  
  67.     }  
  68.     listen(serv_sock,5);  
  69.     while(1){  
  70.         cli_sock = accept(serv_sock,(struct sockaddr *)&client_address,(socklen_t *)&client_len);  
  71.         ssl = SSL_new(ctx);  
  72.         SSL_set_fd (ssl, cli_sock);  
  73.         SSL_accept (ssl);  
  74.         //讀取
  75.          char line[4096];  
  76.         SSL_read(ssl, line, sizeof (line));  
  77.         //正常處理HTTP協議
  78.          //寫入,返回報文。
  79.          SSL_write(ssl,"HTTP/1.0 200 OK/r/n/r/n",19);  
  80.         SSL_write(ssl,"<html><header></header><body><p1>Hello World<p1></body></html>",62);  
  81.         close(cli_sock);  
  82.         SSL_shutdown(ssl);  
  83.         SSL_free(ssl);        
  84.     }  
  85.     SSL_CTX_free (ctx);  
  86. }  
   客戶端:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <errno.h>
  7. #include <unistd.h>
  8. #include <netinet/in.h>
  9. #include <limits.h>
  10. #include <netdb.h>
  11. #include <arpa/inet.h>
  12. #include <ctype.h>
  13. #include <openssl/crypto.h>
  14. #include <openssl/ssl.h>
  15. #include <openssl/err.h>
  16. #include <openssl/rand.h>
  17. #define DEBUG 1
  18. /******************************************** 
  19. 功能:搜尋字串右邊起的第一個匹配字元 
  20. ********************************************/
  21. char *Rstrchr(char *s, char x)  
  22. {  
  23.     int i = strlen(s);  
  24.     if (!(*s))  
  25.         return 0;  
  26.     while (s[i - 1])  
  27.         if (strchr(s + (i - 1), x))  
  28.             return (s + (i - 1));  
  29.         else
  30.             i--;  
  31.     return 0;  
  32. }  
  33. /************************************************************** 
  34. 功能:從字串src中分析出網站地址和埠,並得到使用者要下載的檔案 
  35. ***************************************************************/
  36. void GetHost(char *src, char *web, char *file, int *port)  
  37. {  
  38.     char *pA;  
  39.     char *pB;  
  40.     memset(web, 0, sizeof(web));  
  41.     memset(file, 0, sizeof(file));  
  42.     *port = 0;  
  43.     if (!(*src))  
  44.         return;  
  45.     pA = src;  
  46.     if (!strncmp(pA, "http://", strlen("http://")))  
  47.         pA = src + strlen("http://");  
  48.     elseif (!strncmp(pA, "https://", strlen("https://")))  
  49.         pA = src + strlen("https://");  
  50.     pB = strchr(pA, '/');  
  51.     if (pB) {  
  52.         memcpy(web, pA, strlen(pA) - strlen(pB));  
  53.         if (pB + 1) {  
  54.             memcpy(file, pB + 1, strlen(pB) - 1);  
  55.             file[strlen(pB) - 1] = 0;  
  56.         }  
  57.     } else
  58.         memcpy(web, pA, strlen(pA));  
  59.     if (pB)  
  60.         web[strlen(pA) - strlen(pB)] = 0;  
  61.     else
  62.         web[strlen(pA)] = 0;  
  63.     pA = strchr(web, ':');  
  64.     if (pA)  
  65. 相關推薦

    openssl 程式設計 證書製作

    一、openssl證書製作:1、建立目錄./demoCA/ ./demoCA/newcerts/,建立檔案 ./demoCA/index.txt ./demoCA/serial。2、執行echo 01 > ./demoCA/serial3、製作自己的CA證書$openssl req -new -x509

    Weblogic HTTPS SSL證書製作(自己使用openssl製作CA證書和伺服器證書,自己充當CA的角色)

    一、生成CA證書1、建立私鑰openssl genrsa -out /home/ca/ca-key.pem 10242、建立證書請求openssl req -new -out /home/ca/ca-req.csr -key /home/ca-key.pem3、自簽名證書1

    WIN64使用OPENSSL生成SSL證書

    nbsp 請求 md5 輸入 ssl證書 密碼 http 私鑰 x509 WIN64使用OPENSSL生成SSL證書 下載OPENSSL http://slproweb.com/products/Win32OpenSSL.html 生成服務器端的私鑰(key文件):open

    OpenSSl生成SSL證書(支持https)

    https openssl 一:環境與安裝說明 WIN7_64,Nginx服務器,OpenSSL_Win64。本人使用phpStudy集成開發環境,使用Nginx+PHP,支持瀏覽器https請求。 nginx下載地址:http://nginx.org/en/download.html

    Linux下使用Openssl頒發Apache證書

    value req org 工作 pki 準備 提前 httpd try 1安裝openssl #yum install -y openssl 2進入目錄/etc/pki/tls/certs #cd /etc/pki/tls/certs 3.生成私鑰文件(key) #ope

    openssl生成SSL證書的流程 - moonhillcity的部落格 - CSDN部落格

    1.安裝openssl 之後在/usr/lib/ssl目錄下(ubuntu系統,用whereis查下ssl目錄即可)下找到openssl.cnf,拷貝到工作目錄下。 2.工作目錄下新建demoCA資料夾,資料夾中新建檔案index.txt和serial,再建立一個newcerts的資料夾。在serial裡面

    90後前端妹子,愛程式設計

    【我】出生於江南的一個很美麗的小鎮,依山傍水風景如畫,像詩歌裡描述的那般,是煙柳繁華之地、溫柔富貴之鄉。踏上青石板,聽著深沉的鐘聲,在煙雨的季節裡走過那長長的街巷,看那青苔遍滿的牆根與光滑閃亮的石階泛青的面龐。 【暱稱】祈澈姑娘 【地點】目前就職於上海市徐彙區某物聯網科技公司,其實一直都想知

    openssl 查看證書細節

    req 系列 ext clas pri eat rfc fin openssl 打印證書的過期時間 openssl x509 -in signed.crt -noout -dates 打印出證書的內容: openssl x509 -in cert.pem -noou

    openssl 學習之證書中提取N 和 E

    通常數字證書包含很多資訊,其中N和E值即我們稱為的公鑰。如何從PEM 或者DER格式的證書中提出證書呢?下面給出程式碼實現從PEM和DER編碼的證書中提出N、E。 #include <openssl/evp.h> #include <openssl/x

    https雙向認證、證書製作過程

    1、生成伺服器證書庫 輸入命令: keytool -validity 365 -genkey -v -alias server -keyalg RSA -keystore D:\jks\server.keystore -dname "CN=127.0.0.1,OU=icesoft,O=ices

    組建App開發團隊還是選擇免程式設計平臺快速製作?詳細對比分析

    現在App開發除了自己組建APP開發團隊外,還可以使用第三方的傻瓜式自助平臺,不用程式設計自己快速開發製作App,兩者有何差別,該如何選擇呢?接下來我們對組建APP開發團隊和自建APP之間進行詳細對比。 組建App開發團隊 (一)人員配置: 1、產品經理 專案

    Openssl Win64生成證書

    一、準備工作: 1、 下載win64的Openssl,可到http://slproweb.com/products/Win32OpenSSL.html下載,這裡下載1.0.1j版本。 先安裝Visual C++ 2008Redistributables (x64),然後安

    一步一步教你做ios推送 pem證書製作 php推送

     最近在研究ios的推送問題,遇到了一些問題,最終整理了一下。放在這裡和大家分享 APNS的推送機制 首先我們看一下蘋果官方給出的對ios推送機制的解釋。如下圖 Provider就是我們自己程式的後臺伺服器,APNS是Apple Push Notification Service的縮寫,也就是

    Kubernetes部署(三):CA證書製作

    手動製作CA證書 1.安裝 CFSSL [[email protected] ~]# cd /usr/local/src [[email protected] src]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [[ema

    OpenSSL 程式設計入門

    如果你急切的想構建一個簡單的Web客戶端和伺服器對,這時你就需要使用SSL了..       SSL是一種保護基於TCP協議的網路應用最快而且最簡單的的方法,如果你正在用C語言做開發,那麼對於你來說,最好的選擇可能就是使用OpenSSL了. OpenSSL是在Eric

    13.openssl程式設計——ASN1庫

    13.1  ASN1簡介 ANS.1(Abstract Syntax Notation One, X.208),是一套靈活的標記語言,他允許定義多種資料型別,從integer、bit string、一類的簡單型別到結構化型別,如set和sequence,並且可以使用這些型別

    linux下的OPENSSL程式設計- 簡單函式介紹

    在利用OpenSSL開始SSL會話之前,需要為客戶端和伺服器制定本次會話採用的協議,目前能夠使用的協議包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。需要注意的是,客戶端和伺服器必須使用相互相容的協議,否則SSL會話將無法正常進行。(3 ) 建立會話環境在OpenSSL中建立的SSL會話環境稱為

    nginx反向代理cas-server之2:生成證書,centOS下使用openssl生成CA證書(根證書、server證書、client證書)

    前些天搭好了cas系統,這幾天一致再搞nginx和cas的反向代理,一直不成功,但是走http還是測試通過的,最終確定是ssl認證證書這一塊的問題,原本我在cas服務端裡的tomcat已經配置了證書,並且能夠使用了,但是現在我用nginx代理使用ssl與cas-server

    OpenSSL生成根證書CA及簽發子證書

    系統:CentOS7 32位 目標:使用OpenSSL生成一個CA根證書,並用這個根證書頒發兩個子證書server和client。 先確保系統中安裝了OpenSSL,若沒安裝,可以通過以下命令安裝: ? 1 sudo yum ins

    linux下利用openssl來實現證書的頒發(詳細步驟)

    1、首先需要安裝openssl,一個開源的實現加解密和證書的專業系統。在centos下可以利用yum安裝。 2、openssl的配置檔案是openssl.cnf,我們一般就是用預設配置就可以。如果證書有特殊要求的話,可以修改配置適應需求。這樣必須把相關的檔案放到配置檔