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