Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android openssl s_客户端-默认连接到子域?_Android_Linux_Apache_Ssl_Openssl - Fatal编程技术网

Android openssl s_客户端-默认连接到子域?

Android openssl s_客户端-默认连接到子域?,android,linux,apache,ssl,openssl,Android,Linux,Apache,Ssl,Openssl,在过去的两天里,我一直在试图找出为什么我的android应用程序在使用以下代码连接到我的网站时出现“无对等证书”异常错误: HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("https://mysite.co.uk/android/login.php"); ResponseHandler<String> responseHandler = new BasicRespon

在过去的两天里,我一直在试图找出为什么我的android应用程序在使用以下代码连接到我的网站时出现“无对等证书”异常错误:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("https://mysite.co.uk/android/login.php");
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String response = httpclient.execute(httppost, responseHandler);
当看到结果时,它正在打印我的设计站点的自签名证书!显然,这不是我们所期望的

下面是我的主站点(域和www)和设计站点的三个虚拟主机配置文件

mysite.co.uk.conf

# domain: mysite.co.uk
# public: /home/user/public/mysite.co.uk/public

<VirtualHost *:80>
  ServerName mysite.co.uk
  ServerAlias *.mysite.co.uk
  RedirectMatch permanent /(.*) https://mysite.co.uk/$1
</VirtualHost>

<VirtualHost *:443>

  Header always set Strict-Transport-Security "max-age=63072000;"

  SSLEngine On
  SSLCertificateFile /etc/apache2/ssl/mysite.co.uk/mysite.co.uk.crt
  SSLCACertificateFile /etc/apache2/ssl/mysite.co.uk/gs_intermediate_ca.crt

  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>

  <Directory "/home/user/public/mysite.co.uk/public">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
  </Directory>

  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin admin@mysite.co.uk
  ServerName mysite.co.uk

  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html index.php
  DocumentRoot /home/user/public/mysite.co.uk/public

  # Log file locations
  LogLevel warn
  ErrorLog  /home/user/public/mysite.co.uk/log/error.log
  CustomLog /home/user/public/mysite.co.uk/log/access.log combined
</VirtualHost>
# domain: www.mysite.co.uk
# public: /home/user/public/mysite.co.uk/public

<VirtualHost *:80>
  ServerName www.mysite.co.uk
  ServerAlias *.www.mysite.co.uk
  RedirectMatch permanent /(.*) https://www.mysite.co.uk/$1
</VirtualHost>

<VirtualHost *:443>

  Header always set Strict-Transport-Security "max-age=63072000;"

  SSLEngine On
  SSLCertificateFile /etc/apache2/ssl/mysite.co.uk/www.mysite.co.uk.crt
  SSLCACertificateFile /etc/apache2/ssl/mysite.co.uk/gs_intermediate_ca.crt

  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>

  <Directory "/home/user/public/mysite.co.uk/public">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
  </Directory>

  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin admin@mysite.co.uk
  ServerName www.mysite.co.uk

  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html index.php
  DocumentRoot /home/user/public/mysite.co.uk/public

  # Log file locations
  LogLevel warn
  ErrorLog  /home/user/public/mysite.co.uk/log/error.log
  CustomLog /home/user/public/mysite.co.uk/log/access.log combined
</VirtualHost>
# domain: design.mysite.co.uk
# public: /home/user/public/mysite.co.uk/design/public

<VirtualHost *:80>
  ServerName design.mysite.co.uk
  ServerAlias *.design.mysite.co.uk
  RedirectMatch permanent /(.*) https://design.mysite.co.uk/$1
</VirtualHost>

<VirtualHost *:443>

  SSLEngine On
  SSLCertificateFile /etc/apache2/ssl/design.mysite.co.uk/apache.crt
  SSLCertificateKeyFile /etc/apache2/ssl/design.mysite.co.uk/apache.key

  <Directory />
    Options FollowSymLinks
    AllowOverride None
  </Directory>

  <Directory "/home/user/public/mysite.co.uk/design/public">
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
  </Directory>

  # Admin email, Server Name (domain name), and any aliases
  ServerAdmin contact@mysite.co.uk
  ServerName  design.mysite.co.uk

  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html index.php
  DocumentRoot /home/user/public/mysite.co.uk/design/public

  # Log file locations
  LogLevel warn
  ErrorLog  /home/user/public/mysite.co.uk/log/error.log
  CustomLog /home/user/public/mysite.co.uk/log/access.log combined
</VirtualHost>
当我跑步时:

sudo a2dissite design.mysite.co.uk
sudo service apache2 restart
然后运行:

openssl s_client -connect mysite.co.uk:443

然后我得到了mysite.co.uk的证书详细信息,我的android应用程序又开始工作了。我是不是遗漏了什么?为什么我的服务器默认为设计站点?

我认为您的问题是,您在两个不同的域上使用SSL,这两个域共享相同的IP地址

由于SSL是在web服务(HTTP)之前完成的,SSL无法知道用户是否正在访问
design.mysite.co.uk
mysite.co.uk
,它只知道它正在访问
IPA
上的站点,因此它正在处理它拥有的证书,如果我读得正确的话,该证书是针对
mysite.co.uk

然后HTTP会话启动,当您访问
design.mysite.co.uk
时,浏览器确认提供的证书是否与URL匹配,当您访问
mysite.co.uk
时,它不匹配

解决方案:


获取另一个IP地址并将其提供给其中一个站点,从而将您的网站的SSL访问拆分为两个单独的IP地址,每个IP地址将提供不同的证书。

我认为您的问题在于,您在共享相同IP地址的两个不同域上使用SSL

由于SSL是在web服务(HTTP)之前完成的,SSL无法知道用户是否正在访问
design.mysite.co.uk
mysite.co.uk
,它只知道它正在访问
IPA
上的站点,因此它正在处理它拥有的证书,如果我读得正确的话,该证书是针对
mysite.co.uk

然后HTTP会话启动,当您访问
design.mysite.co.uk
时,浏览器确认提供的证书是否与URL匹配,当您访问
mysite.co.uk
时,它不匹配

解决方案:


获取另一个IP地址并将其提供给其中一个站点,从而将网站的SSL访问拆分为两个单独的IP地址,每个IP地址将提供不同的证书。

因为在同一IP地址后面有多个主机名,并且每个主机都有自己的证书,所以需要使用SNI(服务器名称指示)。这将在SSL握手中发送所需的主机名。要用openssl测试这一点,您必须使用-servername参数,例如

openssl s_客户端-servername mysite.co.uk-connect mysite.co.uk:443


虽然所有当前浏览器默认使用SNI,但看起来android默认不使用SNI,因此可能只从默认服务器获取证书。我自己不是android程序员,但在stackoverflow和其他地方,有几次关于SNI与android的讨论表明,这可能是可能的,但可能不是DefaultHTTPClient类。

因为在同一IP地址后面有多个主机名,每个主机都有自己的证书,所以需要使用SNI(服务器名称指示)。这将在SSL握手中发送所需的主机名。要使用openssl进行测试,必须使用-servername参数,例如

openssl s_客户端-servername mysite.co.uk-connect mysite.co.uk:443


虽然所有当前浏览器默认使用SNI,但看起来android默认不使用SNI,因此可能只会从默认服务器获得证书。我本人不是android程序员,但在stackoverflow和其他网站上有几次关于SNI的讨论表明,这是可能的,但是可能不是DefaultHTTPClient类。

你的网站真的叫
mysite.co.uk
?还是仅仅是一个例子?这只是一个例子?你的网站真的叫
mysite.co.uk
?还是仅仅是一个例子?这只是一个例子我不太确定。我刚刚更改了配置文件的名称,使它们是按照相对于重要性的字母顺序排列,因此mysite.co.uk.conf现在是000-mysite.co.uk(因此在design.mysite.co.uk之前)我禁用了旧站点并启用了重新命名的站点…现在一切都正常了。我不知道为什么会这样,我想我会与您共享信息,看看您是否能对此有所了解。我不知道apache按字母顺序排序站点!您以前做了什么?
重新加载
apache或
重新启动
它?我总是使用
重新启动
,重新加载会有什么区别?
重新加载
和SSL并不总是混合使用,尤其是在添加/删除加密时。Apache通过不重新加载所有内容而只是重新加载配置来节省时间。因为SSL需要重新启动端口侦听器,即杀死整个服务器并启动它再次强调,它不起作用。好吧,那么使用
重新启动
不是这个问题的原因/解决方法吗?只是想让未来的读者明白。我想我可能会写下我刚才所做的更改,让它们都能正常工作,并将其标记为答案?我对此不太确定。我刚刚更改了配置文件的名称,以便它们位于lphab相对于重要性的顺序,因此mysite.co.uk.conf现在是000-mysite.co.uk(因此在design.mysite.co.uk之前)我禁用了旧站点并启用了重新命名的站点…现在一切都正常了。我不知道为什么会这样,我想我会与您共享信息,看看您是否能对此有所了解。我不知道apache按字母顺序排序站点!您以前做了什么?
重新加载
apache或
重新启动
它?我总是使用<代码>重新启动
,重新加载
会有什么区别
sudo a2dissite design.mysite.co.uk
sudo service apache2 restart
openssl s_client -connect mysite.co.uk:443