標籤: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系統管理數位憑證