openSSL 不能与 PHP 内置的 Web 服务器一起使用

2022-08-30 16:00:00

操作系统:Ubuntu 12.04 64 位

PHP 版本: 5.4.6-2~精确+1

当我测试一个https页面时,我正在通过内置的Web服务器(php5 -S localhost:8000)写入,Firefox(16.0.1)说“加载问题:连接中断”,而终端告诉我“::1:37026无效请求(不支持的SSL请求)”。

phpinfo() 告诉我:

  • 注册流套接字传输: tcp, udp, unix, udg, ssl, sslv3, tls
  • [卷曲]SSL: 是
  • SSL 版本: OpenSSL/1.0.1
  • openssl:

    OpenSSL 支持:已启用

    OpenSSL Library Version OpenSSL 1.0.1 14 Mar 2012

    OpenSSL Header Version OpenSSL 1.0.1 14 Mar 2012

是的,http页面工作得很好。

有什么想法吗?


答案 1

请参阅内置 Web 服务器填充程序上的手册部分:
http://php.net/manual/en/features.commandline.webserver.php

它不支持 SSL 加密。它适用于普通的HTTP请求。扩展和函数支持是无关的。它不接受请求或通过流包装器发送响应。openssl

如果您希望SSL在其上运行,请尝试包装器:stunnel

php -S localhost:8000 &   
stunnel3 -d 443 -r 8080  

反正这只是为了玩弄。


答案 2

自上次更新以来已经过去了三年。以下是我如何在2021年在macOS上使用它(作为马里奥答案的扩展):

# Install stunnel
brew install stunnel

# Find the configuration directory
cd /usr/local/etc/stunnel

# Copy the sample conf file to actual conf file
cp stunnel.conf-sample stunnel.conf

# Edit conf
vim stunnel.conf

修改,使其看起来像这样:(所有其他选项都可以删除)stunnel.conf

; **************************************************************************
; * Global options                                                         *
; **************************************************************************

; Debugging stuff (may be useful for troubleshooting)
; Enable foreground = yes to make stunnel work with Homebrew services
foreground = yes
debug = info
output = /usr/local/var/log/stunnel.log

; **************************************************************************
; * Service definitions (remove all services for inetd mode)               *
; **************************************************************************

; ***************************************** Example TLS server mode services

; TLS front-end to a web server
[https]
accept = 443
connect = 8000
cert = /usr/local/etc/stunnel/stunnel.pem
; "TIMEOUTclose = 0" is a workaround for a design flaw in Microsoft SChannel
; Microsoft implementations do not use TLS close-notify alert and thus they
; are vulnerable to truncation attacks
;TIMEOUTclose = 0

这在端口 443 接受 HTTPS/SSL,并使用 stunnel 的默认伪造证书 (在 ) 连接到在端口 8000 上运行的本地 Web 服务器。日志级别为 ,并将日志输出写入 。/usr/local/etc/stunnel/stunnel.peminfo/usr/local/var/log/stunnel.log

启动隧道:

brew services start stunnel # Different for Linux

启动网络服务器:

php -S localhost:8000

现在您可以访问以访问您的Web服务器:屏幕截图https://localhost:443

应该有一个证书错误,你必须点击浏览器警告,但这会让你达到你可以用HTTPS请求击中本地主机的地步,用于开发。


推荐