基於ejbca community 6.3.1.1構建獨立ca系統管理數位憑證

來源:互聯網
上載者:User

標籤:tom   email   listener   pat   src   selected   store   並且   ssl   

  “數位憑證”這個名詞相信很多人聽過,但並不瞭解,“ejbca”可能很多人都沒有聽過

  數位憑證(Certificate),就是互連網通訊過程中標誌通訊各方身份的一個檔案,可以理解為“網路身份證”,主要目的是驗證身份

  ejbca,是一個CA(Certificate Authority)系統軟體,CA是數位憑證認證中心的簡稱,主要功能是管理數位憑證,包括認證的頒發、銷毀、更新等,ejbca實現了CA規範,因此可以用來管理數位憑證

  接下來,筆者將按照ejbca安裝、使用、數位憑證使用、web service介面、nginx代理順序逐步介紹一個獨立ca系統完整的建立與使用過程

centos安裝ejbca-community-6.3.1.1

  ejbca安裝過程算比較複雜了,本文以centos 6.5系統為例介紹安裝過程,其他linux可以參考,windows下的安裝過程幾乎相同,安裝過程使用是ejbca community 6.3.1.1(社區版),安裝過程請嚴格按照以下步驟,不然很容易出錯!

1、安裝基礎環境

  安裝ejbca需要jdk-1.7以上、ant構建工具、可用的mysql資料庫、jboss-7.1.1,其中jdk、ant、mysql安裝配置過程參考http://www.cnblogs.com/ywlaker/p/6129872.html,如果已經安裝過這些,可以忽略,直接進入以下步驟

2、安裝啟動jboss

  從jboss官方網站下載jboss安裝包:jboss-as-7.1.1.Final.tar.gz,解壓並配置環境變數

tar xvf jboss-as-7.1.1.Final.tar.gz -C /usr/javavi /etc/profile

  追加內容

#jboss confexport JBOSS_HOME=/usr/java/jboss-as-7.1.1.Final

  使配置立即生效

source /etc/profile

  啟動jboss,注意最後的&符號,待啟動完成再運行“exit”

sh /usr/java/jboss-as-7.1.1.Final/bin/standalone.sh &exit

  這樣jboss就運行在後台了,以下命令查看jboss進程並關閉

ps -ef|grep jbosskill -9 進程號
3、配置jboss的mysql資料來源

  建立目錄,然後在該目錄下建立module.xml

mkdir -p /usr/java/jboss-as-7.1.1.Final/modules/com/mysql/maincd /usr/java/jboss-as-7.1.1.Final/modules/com/mysql/mainvi module.xml

  module.xml內容如下

<?xml version="1.0" encoding="UTF-8"?><module xmlns="urn:jboss:module:1.0" name="com.mysql"><resources><resource-root path="mysql-connector-java-5.1.27.jar"/></resources><dependencies><module name="javax.api"/><module name="javax.transaction.api"/></dependencies></module>

  下載mysql的驅動包mysql-connector-java-5.1.27.jar,放在/usr/file目錄,然後拷貝到目前的目錄

cp /usr/file/mysql-connector-java-5.1.27.jar ./

  開啟新的shell視窗,運行

sh /usr/java/jboss-as-7.1.1.Final/bin/jboss-cli.sh -c

  如果是“disconnect”狀態,先輸入“connect”,多斷行符號幾次後,運行下面命令

/subsystem=datasources/jdbc-driver=com.mysql.jdbc.Driver:add(driver-name=com.mysql.jdbc.Driver,driver-class-name=com.mysql.jdbc.Driver,driver-module-name=com.mysql,driver-xa-datasource-class-name=com.mysql.jdbc.jdbc.jdbc2.optional.MysqlXADataSource):reload
4、安裝配置ejbca

  從ejbca官方網站下載ejbca安裝包:ejbca_ce_6_3_1_1.zip,放在/usr/file目錄,解壓,準備修改配置

unzip /usr/file/ejbca_ce_6_3_1_1.zip -d /usr/javacd /usr/javamv ejbca_ce_6_3_1_1 ejbca-ce-6.3.1.1cd /usr/java/ejbca-ce-6.3.1.1/conf/

  1、修改ejbca.properties

mv ejbca.properties.sample ejbca.propertiesvi ejbca.properties

  修改如下內容

appserver.home=/usr/java/jboss-as-7.1.1.Finalappserver.type=jboss

  2、修改database.properties

mv database.properties.sample database.propertiesvi database.properties

  修改如下內容

# dataSourcedatasource.jndi-name=jboss/datasources/MySqlDS# mysql infodatabase.name=mysqldatabase.url=jdbc:mysql://127.0.0.1:3306/ejbca?characterEncoding=UTF-8database.driver=com.mysql.jdbc.Driverdatabase.username=rootdatabase.password=root

  3、修改install.properties

mv install.properties.sample install.propertiesvi install.properties

  修改如下內容

#設定ca名稱ca.name=test#設定ca資訊ca.dn=CN=test,O=test,C=cn

  4、修改cesecore.properties、jaxws.properties,不需要修改內容

mv cesecore.properties.sample cesecore.propertiesmv jaxws.properties.sample jaxws.properties

  5、修改web.properties

mv web.properties.sample web.propertiesvi web.properties

  修改如下內容

#密碼最好6位superadmin.password=123456superadmin.cn=superadminhttpsserver.hostname=ca.test.comhttpsserver.dn=CN=${httpsserver.hostname},O=test,C=cn
5、部署ejbca到jboss

  首先,在配置的mysql中建立“ejbca”資料庫,編碼“utf-8”,然後正式用ant構建ejbca並安裝到jboss

cd /usr/java/ejbca-ce-6.3.1.1ant clean deployant installant deploy-keystore

  deploy用ant部署,install產生認證,deploy-keystore將認證部署到jboss,前兩步所需時間較長,過程中如需輸入,請直接斷行符號

6、配置jboss開啟https

  開啟新的shell視窗,運行

sh /usr/java/jboss-as-7.1.1.Final/bin/jboss-cli.sh -c

  如果是“disconnect”狀態,運行“connect”,多斷行符號幾次,準備運行下面4部分配置

  第一部分(配置任意主機可訪問)

/interface=http:add(inet-address="0.0.0.0")/interface=httpspub:add(inet-address="0.0.0.0")/interface=httpspriv:add(inet-address="0.0.0.0")/socket-binding-group=standard-sockets/socket-binding=http:add(port="8080",interface="http")/subsystem=undertow/server=default-server/http-listener=http:add(socket-binding=http)/subsystem=undertow/server=default-server/http-listener=http:write-attribute(name=redirect-socket, value="httpspriv"):reload

  第二部分(配置認證)

/core-service=management/security-realm=SSLRealm:add()/core-service=management/security-realm=SSLRealm/server-identity=ssl:add(keystore-path="${jboss.server.config.dir}/keystore/keystore.jks", keystore-password="serverpwd", alias="prod-ica1")/core-service=management/security-realm=SSLRealm/authentication=truststore:add(keystore-path="${jboss.server.config.dir}/keystore/truststore.jks", keystore-password="changeit")/socket-binding-group=standard-sockets/socket-binding=httpspriv:add(port="8443",interface="httpspriv")/socket-binding-group=standard-sockets/socket-binding=httpspub:add(port="8442", interface="httpspub"):reload

  第三部分(配置ssl)

/subsystem=undertow/server=default-server/https-listener=httpspriv:add(socket-binding=httpspriv, security-realm="SSLRealm", verify-client=REQUIRED)/subsystem=undertow/server=default-server/https-listener=httpspub:add(socket-binding=httpspub, security-realm="SSLRealm"):reload

  第四部分(配置web service)

/system-property=org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH:add(value=true)/system-property=org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH:add(value=true)/system-property=org.apache.catalina.connector.URI_ENCODING:add(value="UTF-8")/system-property=org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING:add(value=true)/subsystem=webservices:write-attribute(name=wsdl-host, value=jbossws.undefined.host)/subsystem=webservices:write-attribute(name=modify-wsdl-address, value=true):reload
使用ejbca管理數位憑證

  ejbca安裝完成後,我們就可以使用它管理數位憑證了,假設安裝ejbca的伺服器位址為:172.17.210.124,我們在windows系統下先配置一個hosts,編輯“C:\Windows\System32\drivers\etc”目錄下的hosts檔案,加入一行

172.17.210.124 ca.test.com

  然後拷貝ejbca伺服器“/usr/java/ejbca-ce-6.3.1.1/p12/”目錄下的superadmin.p12檔案到windows系統,雙擊該檔案開始安裝,預設密碼是“ejbca”,如果配置過程中修改過,請使用修改過的密碼如“123456”

  ejbca系統提供了兩個介面

  管理員介面(需要認證,使用剛才安裝的superadmin認證)

https://ca.test.com:8443/ejbca/adminweb/

  使用者介面

http://ca.test.com:8080/ejbca/

  弄好了超級管理員認證之後,我們開始管理數位憑證吧!

1、使用者註冊

  數位憑證是身份認證的載體,身份認證的對象就是“使用者”,數位憑證包含“使用者”的基本資料,就想身份證包含了你的姓名等基本資料一樣,註冊過程即是你想ejbca提交個人基本資料

  ejbca管理員介面中,開啟“RA Functions”—“Add End Entity”菜單,填寫以下“Required”列打勾的項。

  使用者模板選擇“EMPTY”

  輸入使用者名稱與密碼

  Common name,如果是伺服器用認證,這裡請填寫網域名稱

  填寫認證資訊,憑證範本選擇“ENDUSER”,CA選擇“dev”,Token選擇“P12 file”

  最後點擊“Add”按鈕註冊

2、下載認證

  註冊完使用者,自然迫不及待要弄到一個認證了,在ejbca使用者介面中,開啟“Enroll”—“Create Browser Certificate”菜單

  輸入使用者名稱和密碼,點擊“OK”按鈕,進入下面的頁面

“Key length”選擇“2048 bits”;“Certificate profile”選擇“ENDUSER”,點擊“Enroll”按鈕下載認證

3、吊銷認證

  管理員發現使用者認證被人盜用了,好辦,吊銷它

  ejbca管理員介面中,開啟“RA Functions”—“Search End Entities”菜單。“Search end entities with status”處下拉框選擇“All”,點擊右邊的“Search”按鈕查看使用者資訊(省略其他列)

  勾選需要吊銷的使用者,點擊表格下方的“Revoke Selected”按鈕,吊銷使用者

4、更新認證

  使用者上次申請的認證到期了,要更換新的認證

  ejbca管理員介面中,開啟“RA Functions”—“Search End Entities”菜單。“Search end entities with status”處下拉框選擇“All”,點擊右邊的“Search”按鈕查看使用者資訊(省略其他列)

  點擊需要更新認證使用者的最右邊列中的“Edit End Entity”超連結,編輯使用者

  設定“Status”為“New”,點擊右邊的“Save”按鈕。然後輸入新密碼,其他項保持不變,點擊頁面最下方的“Save”按鈕儲存設定

5、根憑證

  ejbca作為一個CA,有它自己的根憑證

  ejbca使用者介面中,開啟“Retrieve”—“Fetch CA Certificates”菜單,可以下載不同格式的根憑證

6、申請tomcat伺服器憑證

  以上方式可以管理普通使用者用的瀏覽器認證,格式為p12,tomcat伺服器用的認證格式為jks,怎麼申請呢?

  使用者註冊時,憑證範本選擇“SERVER”,CA選擇“dev”,Token選擇“JKS file”,其他項的值不變

  下載認證時,在ejbca使用者介面中,開啟“Enroll”—“Create Keystore”菜單,輸入使用者名稱與密碼,進入下面的頁面

  “Key length”選擇“2048 bits”;“Certificate profile”選擇“SERVER”,點擊“Enroll”按鈕下載認證

  其他伺服器憑證格式大同小異,相信你可以摸索出來!

使用web service構建自己的CA系統

  ejbca系統雖然安裝好了,也可以管理數位憑證,但是,我們所有的操作都在ejbca提供的介面中執行,先不說全部是英文,單單它裡面很多配置項就讓人眼花繚亂,很多配置項要麼是固定的,要麼是不需要的,因此,最合理的做法是在ejbca之上構建一個中介層,使用者訪問中介層提供的認證管理服務,中介層的服務則使用ejbca實現,正好ejbca提供了完整的web service介面

  中介層只需要提供數位憑證的註冊、下載、吊銷、更新即可,更多的功能當然也可以實現,看具體需求了,下面介紹這個中介層的基本實現過程

1、superadmin.jks認證

  ejbca提供的web service介面需要認證認證,官方源碼給出的例子中使用的就是superadmin超級管理員的認證,但格式是jks,因此我們需要弄到superadmin.jks認證,通過工具轉換是可以的,但ejbca可以直接產生

  對superadmin使用者執行更新操作,儲存之前,修改下面項的值為“JKS file”

  按照下載普通使用者認證的步驟下載superadmin的jks格式認證

2、初始化web service串連

  有了superadmin.jks認證,我們就可以用它來串連web service服務了,但是,必須將web service所需的jar包添加到工程中,這些jar包是下面兩個目錄下的所有jar

/usr/java/ejbca-ce-6.3.1.1/dist/ejbca-ws-cli/lib/usr/java/ejbca-ce-6.3.1.1/dist/ejbca-ws-cli

  然後在代碼中初始化web service串連

public void init() {if (!new File(certPath).exists()) return;CryptoProviderTools.installBCProvider();System.setProperty("javax.net.ssl.trustStore", "d:/superadmin.jks");System.setProperty("javax.net.ssl.trustStorePassword", "123456");System.setProperty("javax.net.ssl.keyStore", "d:/superadmin.jks");System.setProperty("javax.net.ssl.keyStorePassword", "123456");QName qname = new QName("http://ws.protocol.core.ejbca.org/", "EjbcaWSService");try {EjbcaWSService service = new EjbcaWSService(new URL("https://ca.test.com:8443/ejbca/ejbcaws/ejbcaws?wsdl"), qname);EjbcaWS ejbcaWS = service.getEjbcaWSPort();} catch (Exception e) {}}

  注意:串連地址只能是網域名稱,這個網域名稱是安裝ejbca時為ejbca伺服器指定的,所以串連ejbca提供的web service介面服務的機器要配置hosts

172.17.210.124 ca.test.com

  初始化的目的是拿到EjbcaWS對象的執行個體,接下來的數位憑證的註冊、下載等服務均基於它

3、實現數位憑證管理服務

  查看使用者是否已經註冊

private boolean isExist(String username) throws Exception {UserMatch usermatch = new UserMatch();usermatch.setMatchwith(UserMatch.MATCH_WITH_USERNAME);usermatch.setMatchtype(UserMatch.MATCH_TYPE_EQUALS);usermatch.setMatchvalue(username);try {List<UserDataVOWS> users = ejbcaWS.findUser(usermatch);if (users != null && users.size() > 0) {return true;} else {return false;}} catch (Exception e) {throw new Exception("檢查使用者 " + username() + " 是否存在時出錯:" + e.getMessage());}}

  使用者註冊與更新,用的都是editUser()方法,因此要先判斷是否存在

public void editUser() throws Exception {UserDataVOWS userData = new UserDataVOWS();userData.setUsername("testname");//使用者名稱userData.setPassword("123456");//密碼userData.setClearPwd(false);//預設userData.setSubjectDN("CN=" + "testname"+ ",OU=" + "testou"+ ",O=" + "testo"+ ",C=cn"+ ",telephoneNumber=" + "1234567890");//設定唯一甄別名String pattern = "yyyy-MM-dd HH:mm:ssZZ"; // ISO 8601標準時間格式userData.setStartTime(DateFormatUtils.format(new Date(),pattern));//認證有效起始日期userData.setEndTime(DateFormatUtils.format(DateUtils.addDays(new Date(), 100), pattern));//結束日期userData.setCaName("test");//ca名稱,ejbca的名稱userData.setSubjectAltName(null);userData.setEmail("[email protected]");//郵件地址userData.setStatus(UserDataVOWS.STATUS_NEW);//狀態為newuserData.setTokenType(UserDataVOWS.TOKEN_TYPE_P12);//設定p12格式認證userData.setEndEntityProfileName("user");//終端實體模板userData.setCertificateProfileName("user");//憑證範本try {ejbcaWS.editUser(userData);} catch (Exception e) {throw new Exception(e.getMessage());}}

  代碼中有幾處值得注意的,終端實體模板“user”和憑證範本“user”需要在ejbca管理員介面中配置,並且終端實體模板“user”中要配置開啟“SubjectDN”的屬性如CN、OU、O、C、telephoneNumber等,還要允許修改startTime和endTime

  吊銷認證

public void revoke(String username) throws ServiceException {try {ejbcaWS.revokeUser(username, RevokedCertInfo.REVOCATION_REASON_UNSPECIFIED, false);} catch (Exception e) {}}

  建立認證

private void createCert(String username, String password, String path) throws Exception {FileOutputStream fileOutputStream = null;try {// 建立認證檔案KeyStore ksenv = ejbcaWS.pkcs12Req(username, password, null, "2048", AlgorithmConstants.KEYALGORITHM_RSA);java.security.KeyStore ks = KeyStoreHelper.getKeyStore(ksenv.getKeystoreData(), "PKCS12", password);fileOutputStream = new FileOutputStream(path + File.separator + username + ".p12");ks.store(fileOutputStream, password.toCharArray());// 建立密碼檔案File pwdFile = new File(path + File.separator + username + ".pwd");pwdFile.createNewFile();BufferedWriter out = new BufferedWriter(new FileWriter(pwdFile));out.write(password);out.flush();out.close();} catch (Exception e) {throw new Exception("使用者  " + username + " 認證建立失敗:" + e.getMessage());} finally {if (fileOutputStream != null) {try {fileOutputStream.close();} catch (IOException e) {}}}}

  認證建立在伺服器上,使用者調用下載認證的介面服務,應該返回一個,這裡介紹用nginx作為檔案下載伺服器,參考http://www.cnblogs.com/ywlaker/p/6129872.html一文介紹的關於nginx的部分

  到此為止,ejbca構建的ca系統已經完成,當然,上述只是核心代碼,怎麼運行、部署就不介紹了,下面簡單介紹https基本原理與數位憑證的使用

https基本原理與數位憑證的使用

基於ejbca community 6.3.1.1構建獨立ca系統管理數位憑證

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.