【问题标题】:openssl s_client -connect defaulting to subdomain?openssl s_client -connect 默认为子域?
【发布时间】:2014-01-16 09:02:27
【问题描述】:

过去两天我一直在试图弄清楚为什么我的 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);

我使用了 SSL Labs 检查器,我的证书以 A 级通过,并且 SSL 链没有问题(我在这里阅读了许多帖子,声称这是问题所在)。无论如何,我认为这是 android 的问题,我尝试了许多不同的建议。

我发现有人建议在我的服务器中输入以下命令:

openssl s_client -connect mysite.co.uk:443

查看结果时,它正在打印我设计网站的自签名证书!显然这不是预期的!

这是我的主站点(域和 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>

www.mysite.co.uk.conf

# 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>

design.mysite.co.uk.conf

# 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>

这也位于我的 apache 配置文件中

SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLCACertificateFile /etc/apache2/ssl/mysite.co.uk/gs_intermediate_ca.crt
SSLStaplingCache shmcb:/var/run/ocsp(128000)

SSLProtocol -ALL +TLSv1 +TLSv1.1 +TLSv1.2
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-RSA-AES128-SHA256:AES128-GCM-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH
SSLInsecureRenegotiation off

当我跑步时:

sudo a2dissite design.mysite.co.uk
sudo service apache2 restart

然后运行:

openssl s_client -connect mysite.co.uk:443

然后我得到 mysite.co.uk 的证书详细信息,我的 android 应用程序再次运行。我在这里错过了什么吗?为什么我的服务器默认使用设计站点?

【问题讨论】:

  • 你的网站真的叫mysite.co.uk吗?还是只是一个例子?
  • 这只是一个例子

标签: android linux apache ssl openssl


【解决方案1】:

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

openssl s_client -servername mysite.co.uk -connect mysite.co.uk:443

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

【讨论】:

  • 非常感谢您为我指明了 SNI 的方向!我做了一些谷歌搜索,发现这个 http://blog.dev001.net/post/67082904181/android-using-sni-with-apache-httpclient-library 将 SNI 添加到 ApacheHttpClient 类。我已重命名我的网站以取消 000- 前缀(请参阅 nrathaus 的答案中的 cmets)并返回 no peer certificate 消息,添加到上面链接中的类中,嘿,很快,它工作得很好!
【解决方案2】:

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

由于 SSL 在 Web 服务 (HTTP) 之前完成,SSL 无法知道用户是在访问 design.mysite.co.uk 还是 mysite.co.uk,它只知道它正在访问 IP A 上的站点,因此它正在处理它拥有的证书,如果我没看错的话是mysite.co.uk

然后HTTP会话开始,浏览器确认提供的证书是否匹配URL,当你访问design.mysite.co.uk它不匹配,当你访问mysite.co.uk它匹配。

解决方案:

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

【讨论】:

  • 我不太确定这个。我刚刚更改了我的配置文件的名称,以便它们按相对于重要性的字母顺序排列,因此 mysite.co.uk.conf 现在是 000-mysite.co.uk(所以在 design.mysite.co.uk 之前)和我禁用了旧站点并启用了重命名的站点...现在一切正常。我不知道为什么会这样,我想我会与您分享信息,看看您是否可以对此有所了解。我不知道 apache 按字母顺序排列网站!
  • 你之前是做什么的? reload apache 还是 restart 它?
  • 我一直使用restartreload 会有什么不同?
  • reload 和 SSL 并不总是混合使用,尤其是在您添加加密/删除它时。 Apache 通过不重新加载所有内容来节省时间,而只是重新加载配置。由于 SSL 需要重新启动端口侦听器,即杀死整个服务器并重新启动它,所以它不会这样做。
  • 好的,所以使用restart 不是这个问题的原因/解决方法?只是想让未来的读者清楚。我想我可能会写下我刚刚所做的所有更改,并将其标记为答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
相关资源
最近更新 更多