最近因為公司的專案,所以研究了有關串流的相關資料。

公司最後決定使用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 的問題了。

arrow
arrow

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()