基于Java和Python实现简单的CA认证系统
資源下載地址:https://download.csdn.net/download/sheziqiong/85629902
實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 CA 系統(tǒng),它包含以下功能:
- 證書(shū)生成:用戶提供 Certificate Signing Request (CSR)和 公鑰后,系統(tǒng)會(huì)自動(dòng)為用戶生成證書(shū)并通過(guò)郵箱發(fā)放,支持 用于 SSL 和代碼簽名的兩類證書(shū)。
- 證書(shū)吊銷(xiāo):用戶發(fā)起證書(shū)吊銷(xiāo)請(qǐng)求后,系統(tǒng)會(huì)為其更新 Certificate Revocation List (CRL),但考慮系統(tǒng)負(fù)荷,用戶的吊銷(xiāo)請(qǐng)求會(huì)被暫時(shí)記錄,然后以天為單位更新,客戶端可以通過(guò) CRL Distribution Point(CRL 分發(fā)點(diǎn):本系統(tǒng)分發(fā)點(diǎn)為:CRL Distribution Point)獲取最新的 CRL 列表。www.biyezuopin.vip
- 證書(shū)審核:用戶的證書(shū)請(qǐng)求需要由管理員審核后才能頒發(fā),因此我們寫(xiě)了一個(gè)簡(jiǎn)單的管理員審核功能。
- 密鑰對(duì)生成:基于 Vue 的 jsrsasign 插件,我們支持客戶端本地生成 RSA 公私密鑰對(duì)。
- 用戶認(rèn)證:包括登錄登出注冊(cè)鑒權(quán)等常用操作,使用 Token 實(shí)現(xiàn)。
- 代碼簽名:除了 CA 系統(tǒng)自生功能外,本項(xiàng)目還提供了一個(gè)簡(jiǎn)單的代碼簽名工具,使用 Java 編寫(xiě),用來(lái)驗(yàn)證項(xiàng)目成果。
最終成果
接口文檔
API 文檔
為了統(tǒng)一前后端請(qǐng)求,所有請(qǐng)求皆使用 POST
CSR 文件上傳
接口:/api/ca/file
文件標(biāo)識(shí):CSR_FILE
返回:該接口會(huì)返回通過(guò) CSR 解析出的用戶公鑰及個(gè)人信息
{"header":{"code":200,"msg":"ok"},"country":"CN","province":"ShanXi","locality":"TaiYuan","organization":"中北大學(xué)","common_name":"junebao.top","email_address":"","organizational_unit":"IT","public_key":"-----BEGIN RSA PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArj/g1UgvJAEnXxlDFHU6\naMwaaZ7BP4zXXWLnfw5kiVTjMPL4kS21do82bygUg4tCPM3pnDt5BpibGwsAZhQ8\nNH527z0Is2yHUT8S/RWT7t7AAJ06NdsEzdyaKAzVHa3xfq6zjVHc11nn0eLB0M0G\nahteIZebHjNhMX3dyVbvUx9e0iAjPDxbCvficbBDhQ1fzZbUoxmS175ENDuoNRY1\nory8+fFAnRhwTJn12mhB/U+QaHiBIfzhC7exMffcUJYK8WYqt0W0+3oS47gyiCt7\nlEyhzQ9UoJVA7O5zsmB39xPLXHIsRLkuAZBIB9YLibZOse5gRCVgd6OYJTyhHbGl\nRwIDAQAB\n-----END RSA PUBLIC KEY-----\n"}功能設(shè)計(jì)
系統(tǒng)流程
數(shù)據(jù)庫(kù)設(shè)計(jì)
CREATE TABLE `ca_requests` (`id` int unsigned NOT NULL AUTO_INCREMENT,`created_at` datetime DEFAULT NULL COMMENT '字段創(chuàng)建時(shí)間',`updated_at` datetime DEFAULT NULL COMMENT '更新時(shí)間',`deleted_at` datetime DEFAULT NULL COMMENT '刪除時(shí)間',`user_id` int NOT NULL COMMENT '申請(qǐng)證書(shū)的用戶ID',`state` int unsigned NOT NULL COMMENT '證書(shū)狀態(tài)(1:待審核, 2: 審核通過(guò), 3:審核未通過(guò))',`public_key` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '公鑰',`country` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '國(guó)家',`province` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '州市',`locality` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '地區(qū)',`organization` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '組織',`organization_unit_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '部門(mén)',`common_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '姓名',`email_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '郵箱',PRIMARY KEY (`id`),KEY `idx_ca_requests_deleted_at` (`deleted_at`) ) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8; CREATE TABLE `certificates` (`id` int unsigned NOT NULL AUTO_INCREMENT,`created_at` datetime DEFAULT NULL,`updated_at` datetime DEFAULT NULL,`deleted_at` datetime DEFAULT NULL,`user_id` int NOT NULL COMMENT '證書(shū)擁有者ID',`state` int unsigned NOT NULL COMMENT '狀態(tài)(1 代表在使用中,2代表已撤銷(xiāo)或過(guò)期)',`request_id` int NOT NULL COMMENT '證書(shū)請(qǐng)求ID',`expire_time` bigint NOT NULL COMMENT '過(guò)期時(shí)間戳',PRIMARY KEY (`id`),KEY `idx_certificates_deleted_at` (`deleted_at`) ) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8; CREATE TABLE `crls` (`id` int unsigned NOT NULL AUTO_INCREMENT,`created_at` datetime DEFAULT NULL,`updated_at` datetime DEFAULT NULL,`deleted_at` datetime DEFAULT NULL,`certificate_id` int NOT NULL COMMENT '證書(shū)ID',`input_time` bigint NOT NULL COMMENT '加入時(shí)間戳',PRIMARY KEY (`id`),KEY `idx_crls_deleted_at` (`deleted_at`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='證書(shū)吊銷(xiāo)列表'; CREATE TABLE `user_tokens` (`id` int unsigned NOT NULL AUTO_INCREMENT,`created_at` datetime DEFAULT NULL,`updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,`deleted_at` datetime DEFAULT NULL,`user_id` int NOT NULL,`token` varchar(64) NOT NULL,`expire_time` bigint NOT NULL,PRIMARY KEY (`id`),KEY `idx_user_tokens_deleted_at` (`deleted_at`) ) ENGINE=InnoDB AUTO_INCREMENT=81 DEFAULT CHARSET=utf8; CREATE TABLE `users` (`id` int unsigned NOT NULL AUTO_INCREMENT,`created_at` datetime DEFAULT NULL,`updated_at` datetime DEFAULT NULL,`deleted_at` datetime DEFAULT NULL,`username` varchar(16) NOT NULL,`password` varchar(255) NOT NULL,`email` varchar(255) DEFAULT NULL,`authority` int DEFAULT NULL COMMENT '權(quán)限,1表示系統(tǒng)管理員',PRIMARY KEY (`id`),UNIQUE KEY `username` (`username`),KEY `idx_users_deleted_at` (`deleted_at`) ) ENGINE=InnoDB AUTO_INCREMENT=62 DEFAULT CHARSET=utf8;背景知識(shí)
PKI
加密算法
對(duì)稱加密:3DES
3DES(或稱為 Triple DES)是三重?cái)?shù)據(jù)加密算法(TDEA,Triple Data Encryption Algorithm)塊密碼的通稱。它相當(dāng)于是對(duì)每個(gè)數(shù)據(jù)塊應(yīng)用三次 DES 加密算法。由于計(jì)算機(jī)運(yùn)算能力的增強(qiáng),原版 DES 密碼的密鑰長(zhǎng)度變得容易被暴力破解;3DES 即是設(shè)計(jì)用來(lái)提供一種相對(duì)簡(jiǎn)單的方法,即通過(guò)增加 DES 的密鑰長(zhǎng)度來(lái)避免類似的攻擊,而不是設(shè)計(jì)一種全新的塊密碼算法。
- DES
非對(duì)稱加密 RSA
- RSA
哈希算法
MD5
SHA256
X.509
X.509 是密碼學(xué)里公鑰證書(shū)的格式標(biāo)準(zhǔn)。X509 證書(shū)己應(yīng)用在包括 TLS/SSL 在內(nèi)的眾多
Internet 協(xié)議里,同時(shí)它也用在很多非在線應(yīng)用場(chǎng)景里,比如電子簽名服務(wù)。X509 證書(shū)里含有公鑰、身份信息(比如網(wǎng)絡(luò)主機(jī)名,組織的名稱或個(gè)體名稱等)和簽名信息(可以是證書(shū)簽發(fā)機(jī)構(gòu) CA 的簽名,也可以是自簽名)。對(duì)于一份經(jīng)由可信的證書(shū)簽發(fā)機(jī)構(gòu)簽名或者可以通過(guò)其它方式驗(yàn)證的證書(shū),證書(shū)的擁有者就可以用證書(shū)及相應(yīng)的私鑰來(lái)創(chuàng)建安全的通信,對(duì)文檔進(jìn)行數(shù)字簽名.另外除了證書(shū)本身功能,Ⅹ509 還附帶了證書(shū)吊銷(xiāo)列表和用于從最終對(duì)證書(shū)進(jìn)行簽名的證書(shū)簽發(fā)機(jī)構(gòu)直到最終可信點(diǎn)為止的證書(shū)合法性驗(yàn)證算法。
在 X.509 里,組織機(jī)構(gòu)通過(guò)發(fā)起證書(shū)簽名請(qǐng)求(CSR)來(lái)得到一份簽名的證書(shū)。首先需要生成一對(duì)鑰匙對(duì),然后用其中的私鑰對(duì) CSR 進(jìn)行簽名,并安全地保存私鑰。CSR 進(jìn)而包含有請(qǐng)求發(fā)起者的身份信息、用來(lái)對(duì)此請(qǐng)求進(jìn)行驗(yàn)真的的公鑰以及所請(qǐng)求證書(shū)專有名稱。CSR 里還可能帶有 CA 要求的其它有關(guān)身份證明的信息。然后 CA 對(duì)這個(gè)專有名稱發(fā)布一份證書(shū),并綁定一個(gè)公鑰. 組織機(jī)構(gòu)可以把受信的根證書(shū)分發(fā)給所有的成員,這樣就可以使用公司的 PKI 系統(tǒng)了。
證書(shū)格式
版本號(hào)(Version Number):規(guī)范的版本號(hào),目前為版本 3,值為 0x2;
序列號(hào)(Serial Number):由 CA 維護(hù)的為它所發(fā)的每個(gè)證書(shū)分配的一的列號(hào),用來(lái)追蹤和撤銷(xiāo)證書(shū)。只要擁有簽發(fā)者信息和序列號(hào),就可以唯一標(biāo)識(shí)一個(gè)證書(shū),最大不能過(guò) 20 個(gè)字節(jié);
簽名算法(Signature Algorithm):數(shù)字簽名所采用的算法,如:sha256-with-RSA-Encryptionccdsa-with-SHA2S6;
頒發(fā)者(Issuer):發(fā)證書(shū)單位的標(biāo)識(shí)信息,如 ” C=CN,ST=Beijing, L=Beijing, O=org.example.com,CN=ca.org。example.com ”;
有效期(Validity): 證書(shū)的有效期很,包括起止時(shí)間。
主體(Subject) : 證書(shū)擁有者的標(biāo)識(shí)信息(Distinguished Name),如:" C=CN,ST=Beijing, L=Beijing,CN=person.org.example.com”;
主體的公鑰信息(SubJect Public Key Info):所保護(hù)的公鑰相關(guān)的信息:
公鑰算法 (Public Key Algorithm)公鑰采用的算法;
主體公鑰(Subject Unique Identifier):公鑰的內(nèi)容。
頒發(fā)者唯一號(hào)(Issuer Unique Identifier):代表頒發(fā)者的唯一信息,僅 2、3 版本支持,可選;
主體唯一號(hào)(Subject Unique Identifier):代表?yè)碛凶C書(shū)實(shí)體的唯一信息,僅 2,3 版本支持,可選:
擴(kuò)展(Extensions,可選): 可選的一些擴(kuò)展。中可能包括:Subject Key Identifier:實(shí)體的秘鑰標(biāo)識(shí)符,區(qū)分實(shí)體的多對(duì)秘鑰;
Basic Constraints:一指明是否屬于 CA;Authority Key Identifier:證書(shū)頒發(fā)者的公鑰標(biāo)識(shí)符;
CRL Distribution Points: 撤銷(xiāo)文件的頒發(fā)地址;
Key Usage:證書(shū)的用途或功能信息。
證書(shū)吊銷(xiāo)
在公共密鑰基礎(chǔ)設(shè)施(PKI)中, CSR 是證書(shū)申請(qǐng)者發(fā)送給 CA 機(jī)構(gòu)用于為其簽發(fā)數(shù)字證書(shū)的文件,其常見(jiàn)格式為 PKCS#10 和 SPKAC , 一般情況下,他會(huì)包含一個(gè)用戶公鑰和必要的用戶信息,X.509 標(biāo)準(zhǔn)中,列舉了如下列:
申請(qǐng)者在生成證書(shū)之前,應(yīng)該先生成一個(gè)密鑰對(duì),自己妥善保管私鑰,對(duì)于 CSR 中的信息,應(yīng)該使用私鑰簽名以防止被篡改。因此,一個(gè)標(biāo)準(zhǔn) CSR 包含下面三部分信息:
本系統(tǒng)允許申請(qǐng)人通過(guò)填寫(xiě)表單快速提交個(gè)人信息和公鑰,同時(shí)也允許申請(qǐng)人直接上傳 CSR 文件。
本地通過(guò) openSSL 生成 CSR 的方法:
# 生成隨機(jī)私鑰 openssl genrsa -des3 -out server.key 2048 # 使用私鑰簽發(fā) CSR openssl req -new -nodes -keyout server.key -out server.csr模塊劃分和人員分工
| 證書(shū)請(qǐng)求 | 1. CSR 文件上傳 2. CSR 表單填寫(xiě) | |
| 公鑰提交 用戶證書(shū)查詢 | ||
| 證書(shū)生成 | 1. 待審核列表 2. 頒發(fā)證書(shū) 3. 駁回請(qǐng)求 | |
| 登錄注冊(cè)鑒權(quán) | 1. 登錄 2. 注冊(cè) 3. 登出 | |
| 證書(shū)吊銷(xiāo) | 1. 證書(shū)吊銷(xiāo)請(qǐng)求 2. CRL 分發(fā) | |
| 代碼簽名 |
資源下載地址:https://download.csdn.net/download/sheziqiong/85629902
總結(jié)
以上是生活随笔為你收集整理的基于Java和Python实现简单的CA认证系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据库添加
- 下一篇: CRM系统助家具企业华丽转身