Android openssl s_客户端-默认连接到子域?
在过去的两天里,我一直在试图找出为什么我的android应用程序在使用以下代码连接到我的网站时出现“无对等证书”异常错误: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
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