最近因為公司的專案,所以研究了有關串流的相關資料。
公司最後決定使用Kurento + webrtc的方式來處理串流,Android端的播放也在研究的範圍內,
所以小弟有去研究如何在Android端不是使用Chrome瀏灠器,而是使用相關的API來播放webrtc,最後決定使用 NUBOMEDIA 開發的tree API來實作;因為花費太多時間,加上這個專案看起來沒有人在維護的感覺,所以最後決定先放棄Android端的Native開發,而是改為使用Android端上的Chrome來進行;不過在研究這個部份時,碰到很多問題,其中印象最深的問題是:
WebRTC使用HTTPS來通訊,所以如果不是透過Chrome之類的瀏灠器,程式會因為憑證問題,而無法進行連線。
這個問題的解決方法,只有二種:
1。申請一個正式的DNS,搭配一個憑證。
2。自己產生憑證,並讓程式信任這個憑證的內容。
其實還有一種是去修改JAR檔裡的程式,Disabled SSL的認證功能,不過因為要動到3th party的程式,所以不建議。
而下方要談的,就是第二種。
解決方法:
0。申請DNS -- 基本上筆者在測試時,是透過DNS,不過IP好像也行,雖然我自己沒有測試過。
1。建立憑證 with DNS
建立時可以參考下列二篇:
在這二篇中有教導如何建立憑證,請大家參考一下,即可建立包含DNS的憑證;在建立憑證的過程中,最重要的是在openssl.cnf的設定中,
關於[alt_names]的部份,設定好關於DNS或IP的部份,下方是範例:
[alt_names]
DNS.1 = *.mycompany.tw
IP.1 = 192.168.0.1
在這個步驟的最後,產生一個P12檔。
2。將產生出來的P12檔丟到kurento的tree-server範例程式中kurento-tree-server的src/main/resources/下,並修改application.properties(注意:空白會影響程式,請注意)
範例:
#p12檔案
server.ssl.key-store: classpath:san_domiain_com.p12
#p12檔案的密碼
server.ssl.key-store-password: kurento
#改為p12的TYPE
server.ssl.keyStoreType: PKCS12
#這個部份是根據指令keytool -v -list --keystore san_domiain_com.p12的輸出內容的Alias name來設定的
server.ssl.keyAlias:1
設定完後可以啟動程式看看,看能不能正常啟動。
3。將P12轉為PEM檔
再來從這個網站,將P12檔轉為PEM檔。
4。再將PEM檔轉為cert檔
透過指令:
openssl x509 -outform der -in your-cert.pem -out your-cert.crt
轉出為cert檔。
5。將轉出的cert檔放到Android中的assets資料夾中。
6。參考原kurento room的程式
try {
String wsUri = "wss://abc.mycompany.tw:8890/kurento-tree/websocket";
kurentoTreeAPI = new KurentoTreeAPI(executor, wsUri, this);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput = new BufferedInputStream(getBaseContext().getAssets().open("your-cert.crt"));
Certificate myCert = cf.generateCertificate(caInput);
kurentoTreeAPI.addTrustedCertificate("1", myCert);
kurentoTreeAPI.useSelfSignedCertificate(true);
kurentoTreeAPI.connectWebSocket();
} catch (CertificateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
這樣就可以解決 trusted certificate 的問題了。
留言列表