使服务器仅接受来自Android应用程序的连接

使服务器仅接受来自Android应用程序的连接,android,server,Android,Server,我想知道是否有任何方法可以使我的主机只接受来自我的应用程序的连接,并拒绝来自任何web浏览器的连接。最好的方法可能是将SSL与客户端证书一起使用。这将为您提供身份验证和加密 您可能熟悉在在线支付时通过HTTPS使用SSL来保护web浏览器的安全。该过程类似,只是服务器还必须配置为需要客户端证书。在Apache中,这是一个名为SSLVerifyClient的设置。这将迫使web服务器要求客户端提供证书,然后验证它是否有效 从根授权机构(如Verisign)分配客户端证书可能会很昂贵,因此您可能希望

我想知道是否有任何方法可以使我的主机只接受来自我的应用程序的连接,并拒绝来自任何web浏览器的连接。

最好的方法可能是将SSL与客户端证书一起使用。这将为您提供身份验证和加密

您可能熟悉在在线支付时通过HTTPS使用SSL来保护web浏览器的安全。该过程类似,只是服务器还必须配置为需要客户端证书。在Apache中,这是一个名为SSLVerifyClient的设置。这将迫使web服务器要求客户端提供证书,然后验证它是否有效

从根授权机构(如Verisign)分配客户端证书可能会很昂贵,因此您可能希望生成自己的证书。您可以使用OpenSSL实现这一点

拥有客户端证书后,必须将证书复制到设备上的应用程序存储中。然后可以使用密钥库对象打开它。一旦它打开,您就可以在使用HttpUrlConnection对象时将其与HTTP请求关联

由于您可能会生成自己的证书,而不是使用来自根权限的证书,因此您需要在Android应用程序中设置TrustManager以接受您的自签名证书,并在发出请求时将其与HttpUrlConnection关联

这是总的策略,应该足以让你开始。如果你在某些特定的问题上陷入困境,试着问一些关于不同部分的问题。Apache和OpenSSL部分可能会更好地发布在上

以下是服务器端内容的一些链接:


以下是Android开发的链接:


(在开发过程中有用)

看起来你需要的只是这些链接,但我会在这里总结一下Android代码。请注意,我没有这方面的测试环境,因此代码不完整且未经测试。同样,这只是为了让你开始

// open the certificate
keyStore = KeyStore.getInstance("PKCS12");
fis = new FileInputStream(certificateFile);
keyStore.load(fis, clientCertPassword.toCharArray());


// create the SSL context
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(keyStore, clientCertPassword.toCharArray());
KeyManager[] keyManagers = kmf.getKeyManagers();

TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(trustStore);
TrustManager[] trustManagers = tmf.getTrustManagers();

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, null);


// perform the HTTP request
String result = null;
HttpURLConnection urlConnection = null;

try {
    URL requestedUrl = new URL(url);
    urlConnection = (HttpURLConnection) requestedUrl.openConnection();
    if(urlConnection instanceof HttpsURLConnection) {
        ((HttpsURLConnection)urlConnection)
             .setSSLSocketFactory(sslContext.getSocketFactory());
    }
    urlConnection.setRequestMethod("GET");
    urlConnection.setConnectTimeout(1500);
    urlConnection.setReadTimeout(1500);
    lastResponseCode = urlConnection.getResponseCode();
    result = IOUtil.readFully(urlConnection.getInputStream());
    lastContentType = urlConnection.getContentType();
} catch(Exception ex) {
    result = ex.toString();
} finally {
    if(urlConnection != null) {
        urlConnection.disconnect();
    }
}

从未对网页这样做过,但你可以使用某种握手。一个过于简化的例子可能是,只要客户机连接,向他们发送一个号码,并期望返回某个号码(验证客户机是否知道某些硬编码算法)。它是什么类型的服务器?(Apache,nginx,你写的东西,等等)这是Apache。正常的行为是应用程序用户将信息从应用程序上传到服务器中托管的mysql数据库。我只是想防止有人嗅探流量,通过这种方式获取URL并将虚假信息上传到数据库。