首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取Apache以允许通过HTTPS访问Express API

问获取Apache以允许通过HTTPS访问Express API
EN

Stack Overflow用户
提问于 2019-07-20 05:18:27
回答 1查看 184关注 0票数 0

我的网站(https://www.tjbrackett.com/contact)在Apache上,无法通过HTTPS访问同一台服务器上的Express应用程序。在我将SSL证书添加到站点之前,设置运行得很好。当我恢复SSL证书时,它再次工作。我在前端收到的错误是ERR_CERT_AUTHORITY_INVALID。

我已经尝试设置了代理/反向代理。我不确定我是否正确设置了它们。我已经在Express应用程序上做了一个自签名SSL证书。我尝试在HTTPS域的顶部提供Express应用程序。

HTTPS Apache mysite.conf

代码语言:javascript
复制
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName www.tjbrackett.com
        ServerAdmin tj@brackett.dev
        ServerAlias tjbrackett.com
        DirectoryIndex index.html
        DocumentRoot /var/www/tjbrackett.com

        <Directory /var/www/tjbrackett.com>
                    order allow,deny
                    allow from all

                    RewriteEngine on

                    RewriteCond %{REQUEST_FILENAME} -s [OR]
                    RewriteCond %{REQUEST_FILENAME} -l [OR]
                    RewriteCond %{REQUEST_FILENAME} -d
                    RewriteRule ^.*$ - [NC,L]
                    RewriteRule ^(.*) /index.html [NC,L]

        </Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/www.tjbrackett.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.tjbrackett.com/privkey.pem

ProxyRequests On
ProxyPass /contact https://www.tjbrackett.com:8443/
ProxyPassReverse /contact https://www.tjbrackett.com:8443/

</VirtualHost>

Express应用

代码语言:javascript
复制
const nodemailer = require('nodemailer');
const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');
const http = require('http');
const https = require('https');
const app = express();

const options = {
    key: fs.readFileSync(__dirname + '/key.pem'),
    cert: fs.readFileSync(__dirname + '/cert.pem')
}
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', "*");
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    next();
});


app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.json());

app.post('/', (req, res) => {
    let name = req.body.name;
    let email = req.body.email;
    let subject = req.body.subject;
    let message = req.body.message;
    let mailOptions = "";
    console.log(req.body);
    console.log(req.hostname);

    let transporter = nodemailer.createTransport({
        service: 'gmail',
        secure: true,
        auth: {
            user: 'myEmail@bot.com',
            pass: 'jsfoffamlhqzfqnu'
        },
        tls: {
            rejectUnauthorized: false
        }
    });
    if (req.hostname === "www.tjbrackett.com"){
        mailOptions = {
            from: email,
            to: 'myEmail@gmail.com',
            subject: subject,
            text: message + "\nName: " + name + "\nEmail: " + email,
        };
    } else {
        mailOptions = {
            from: email,
            to: 'anotherEmail@gmail.com',
            subject: subject,
            text: message + "\nName: " + name + "\nEmail: " + email,
        }
    }

    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
            console.log(error);
        } else {
            console.log('Email sent: ' + info.response);
        }
    });

    res.send(req.body);
})

http.createServer(app).listen(8888, () => {
    console.log("Server started on port 8888");
});
https.createServer(options, app).listen(8443, () => {
    console.log("Server started on port 8443");
});

React抓取

代码语言:javascript
复制
fetch("https://www.tjbrackett.com:8443", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
    name: this.state.name,
    email: this.state.email,
    message: this.state.message
}) 

我对Apache/web服务器非常陌生,所以在这一点上,我对研究这个问题还不够了解。我们非常感谢您的任何建议。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-20 08:32:03

使用与我的URL关联的相同SSL证书,允许我的网站访问Express API。

新的Express代码

代码语言:javascript
复制
const options = {
    key: fs.readFileSync('/path/to/cert/info/privkey.pem'),
    cert: fs.readFileSync('/path/to/cert/info/cert.pem'),
    ca: fs.readFileSync('/path/to/cert/info/chain.pem')
}

对于SSL,我使用了Let's Encrypt/Certbot。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57119688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档