我在Android中使用Cordova 3.1的混合应用程序。
在我的应用程序中,我必须打开一个HTTPS页面,这是我的开发服务器配置了一个自签名证书。
如果我从浏览器直接打开URL,出现一个异常,但我可以接受它。如果我从本地应用程序打开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>
我发现的另一种方法是生成CA并使用该CA创建证书,然后您必须将。cer复制到移动设备中,并在Android"设置>安全>从存储安装"中导入为CA生成的。cer。
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服务器机器的主机名
确保
android:debuggable="true"
存在于Cordova项目根目录下的AndroidManifest.xml文件中。我有过这样的经历,当这个设置为false时,它将不接受自签名证书。
我认为这更多的是一个变通方法,但只是以防它可以帮助别人:
我不能在2.3.3中做到这一点,但我可以在4.1.2
我还必须使用keystore (p12)导出证书,并在移动设备中安装。p12而不是。cer,其中包含"设置>安全>从存储安装"。(也许我没有正确生成。cer)
证书的CN必须是你用来打开网页的主机名。
要测试配置,请尝试使用浏览器打开您试图从应用程序打开的相同URL,如果没有异常出现,则表示它正在工作