如何在Android混合应用程序中打开HTTPS页面(带有自签名证书)

时间:2014-06-10 21:01:55

标签: javascript android cordova cordova-3

我在Android的Cordova 3.1中使用混合应用程序。

在我的应用程序中,我必须打开一个HTTPS页面,该页面是我的开发服务器,配置了自签名证书。

如果我从浏览器打开URL direclty,则会出现异常,但我可以接受。 如果我从本机应用程序打开URL,我可以打开实现WebViewClient onReceivedSslError方法的页面。

但是在使用javascript的混合应用程序中,使用window.open()我无法处理ssl异常。

我尝试在Android 2.3.3中安装证书,将证书导出到.cer文件并使用设置>进行安装。安全>从存储中安装并在浏览器中接受例外,但它仍然失败。

有任何帮助吗?谢谢。

这是AndroidManifest.XML

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.ApiManager" android:versionCode="1" android:versionName="1.0">  
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="18"/>  
<supports-screens android:smallScreens="false" android:normalScreens="true" android:largeScreens="false"/>  
<uses-permission android:name="android.permission.INTERNET"/>  
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
<!-- Push permissions -->  
<permission android:name="com.ApiManager.permission.C2D_MESSAGE" android:protectionLevel="signature"/>  
<uses-permission android:name="com.ApiManager.permission.C2D_MESSAGE"/>  
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>  
<uses-permission android:name="android.permission.WAKE_LOCK"/>  
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>  
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
<application android:label="@string/app_name" android:debuggable="true" android:icon="@drawable/icon"> 
    <activity android:name=".ApiManager" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTask"> 
        <intent-filter> 
            <action android:name="android.intent.action.MAIN"/>  
            <category android:name="android.intent.category.LAUNCHER"/> 
        </intent-filter>  
        <intent-filter> 
            <action android:name="com.ApiManager.ApiManager.NOTIFICATION"/>  
            <category android:name="android.intent.category.DEFAULT"/> 
        </intent-filter> 
    </activity>  
    <!-- Preference Activity  -->  
    <activity android:name="com.worklight.common.WLPreferences" android:label="Worklight Settings"></activity>  
    <!-- Push service  -->  
    <!-- In order to use the c2dm library, an application must declare a class with the name C2DMReceiver, in its own package, extending com.google.android.c2dm.C2DMBaseReceiver 
        It must also include this section in the manifest, replacing "com.google.android.apps.chrometophone" with its package name. -->  
    <service android:name=".GCMIntentService"/>  
    <service android:name=".ForegroundService"/>  
    <!-- Only google service can send data messages for the app. If permission is not set - any other app can generate it -->  
    <receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 
        <!-- Receive the actual message -->  
        <intent-filter> 
            <action android:name="com.google.android.c2dm.intent.RECEIVE"/>  
            <category android:name="com.ApiManager"/> 
        </intent-filter>  
        <!-- Receive the registration id -->  
        <intent-filter> 
            <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>  
            <category android:name="com.ApiManager"/> 
        </intent-filter> 
    </receiver> 
</application> 
</manifest>

3 个答案:

答案 0 :(得分:1)

我发现的其他方法是生成CA并使用该CA创建证书,然后您必须在移动设备中复制.cer并导入在Android中为CA生成的.cer设置&gt;设置&gt;安全&gt;从存储安装&#34;。

openssl genrsa -out myownca.key 1024
openssl req -x509 -new -key myownca.key -out myownca.cer -days 365 

这是要在手机中安装的.cer。

然后使用该CA生成证书以供服务器使用

openssl genrsa -out mycert.key 1024 
openssl req -new -out mycert.req -key mycert.key 
openssl x509 -req -in mycert.req -out mycert.cer -CAkey myownca.key -CA myownca.cer -days 365 -CAcreateserial -CAserial serial 
openssl pkcs12 -export -out mykeystore.p12 -inkey mycert.key -in mycert.cer -certfile myownca.cer

此.p12是用于在服务器中导入新证书的。

对于最后一个证书,您必须使用CN作为服务器计算机的主机名。

答案 1 :(得分:0)

确保

android:debuggable="true"

存在于Cordova项目根目录内的AndroidManifest.xml文件中。我经历过这种情况,如果设置为假,它将不接受自签名证书。

答案 2 :(得分:0)

我认为这更像是一种解决方法,但万一它可以帮助其他人:

我无法在2.3.3中完成,但我可以使用4.1.2

此外,我必须使用密钥库导出证书(p12)并使用&#34;设置&gt;在移动设备中安装.p12而不是.cer。安全&gt;从存储安装&#34;。 (也许我没有正确生成.cer)

证书的CN也必须是您用来打开网页的主机名。

要测试配置,请尝试使用浏览器打开您尝试从应用程序打开的相同URL,如果没有出现异常,则表明它正在运行。