行云流水地实现用nginx配置本地IP为https

nginx配置https私有证书访问

剧情需要,测试一下Java代码访问https,遂需要创建一个https的环境

平台:Windows 10

步骤:分为两个大步骤,即:证书生成nginx配置json-server关联java实现通过证书访问接口

证书生成

  1. 创建myAwesomeCA.cnf文件,并赋予如下内容
[ req ]
distinguished_name = req_distinguished_name
x509_extensions = root_ca

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, fully qualified host name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64

[ root_ca ]
basicConstraints = critical, CA:true
  1. 创建myAwesomeServer.ext文件,并赋予如下内容
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
IP.1 = 192.168.101.150
IP.2 = 192.168.100.150

生成的文件结构如下

image-20210911233105679.png
  1. 生成myAwesomeCA.cermyAwesomeCA.pvk,在终端执行如下命令
openssl req -x509 -newkey rsa:2048 -out myAwesomeCA.cer -outform PEM -keyout myAwesomeCA.pvk -days 10000 -verbose -config myAwesomeCA.cnf -nodes -sha256 -subj "/CN=MyCompany CA"
# 注:openssl是MSYS2中的可执行文件

生成的文件结构如下

image-20210911233410336.png
  1. 生成myAwesomeServer.req,在终端执行如下命令
openssl req -newkey rsa:2048 -keyout myAwesomeServer.pvk -out myAwesomeServer.req -subj /CN=localhost -sha256 -nodes

生成的文件结构如下

image-20210911233618013.png
  1. 生成myAwesomeServer.cer,在终端执行如下命令
openssl x509 -req -CA myAwesomeCA.cer -CAkey myAwesomeCA.pvk -in myAwesomeServer.req -out myAwesomeServer.cer -days 10000 -extfile myAwesomeServer.ext -sha256 -set_serial 0x1111
image-20210911233751475.png

nginx配置

  1. 下载nginx-1.20.1.zip并解压

  2. 在命令行执行nginx.exe

  3. 浏览器访问http://localhost(或者http://你的ip)

image-20210911225625400.png

如果你现在输入https://localhost,你断然不能访问哟

image-20210912202314421.png

现在我们要做的事情就是要支持https://localhost访问

  1. 进入conf文件夹,并将myAwesomeServer.cer以及myAwesomeServer.pvk拷贝到该目录下
image-20210912202710436.png
  1. 编辑一下conf目录下的nginx.conf文件
image-20210912202456952.png
  1. 将nginx.conf做如下内容更改
image-20210912203409298.png
  1. 关掉之前执行nginx.exe的窗口,再新开窗口,执行nginx.exe
image-20210912203921498.png

此刻你能正确访问该地址,点击高级

image-20210912203947253.png

点击继续访问

image-20210912204006044.png

此刻便正确得到了访问内容

json-server关联

  1. 自行安装并启动json-server,然后接口访问
image.png
  1. 修改nginx的nginx.conf文件
image.png
  1. 执行nginx -s reload命令后访问http://localhost/posts
image.png
  1. 现在对https做相同的操作,修改nginx的nginx.conf文件
image.png
  1. 执行nginx -s reload命令后访问http://localhost/posts
image.png

正确访问,总体来讲,就是我们访问http://localhost以及https://localhost时,都指向了http://localhost:3000端口的json-server内容

java实现通过证书访问接口

  1. 新建一个Kotlin工程,再build.gradle添加okhttp依赖
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
  1. 编写代码
fun main(args: Array<String>) {
    val okClient = OkHttpClient.Builder()
        .build()
    val request = Request.Builder()
        .url("http://localhost/posts")
        .build()
    return try {
        val execute = okClient.newCall(request).execute()
        val bodyString = execute.body()?.string()
        println("body:\n$bodyString")
    } catch (e: IOException) {
        println("body:\n" + e.message)
    }
}

并执行,得到如下结果

body:
[
  {
    "id": 1,
    "title": "json-server",
    "author": "typicode"
  },
  {
    "token": "861bc663-eaea-4bf3-9e93-6c3a818b6929",
    "userId": "107",
    "id": 2
  }
]

我们将http改为https的话

image.png

再次执行得到如下结果

body:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

是的,这就是没有证书的表现,现在我们添加私有证书,还记得前面我们生成的myAwesomeCA.cer吗,我们将会用到它

修改之前的kotlin代码

image.png

具体代码如下

fun main(args: Array<String>) {
    val sslContext: SSLContext
    val trustManagers: Array<TrustManager>
    try {
        val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
        keyStore.load(null, null)
        val certInputStream: InputStream = FileInputStream(File("C:\\Users\\Watson\\Downloads\\https\\myAwesomeCA.cer"))
        val bis = BufferedInputStream(certInputStream)
        val certificateFactory = CertificateFactory.getInstance("X.509")
        while (bis.available() > 0) {
            val cert = certificateFactory.generateCertificate(bis)
            keyStore.setCertificateEntry("anchor", cert)
        }
        val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
        trustManagerFactory.init(keyStore)
        trustManagers = trustManagerFactory.trustManagers
        sslContext = SSLContext.getInstance("TLS")
        sslContext.init(null, trustManagers, null)
    } catch (e: Exception) {
        e.printStackTrace()
        return
    }

    val okClient = OkHttpClient.Builder()
        .sslSocketFactory(sslContext.socketFactory, trustManagers[0] as X509TrustManager)
        .build()
    val request = Request.Builder()
        .url("https://localhost/posts")
        .build()
    return try {
        val execute = okClient.newCall(request).execute()
        val bodyString = execute.body()?.string()
        println("body:\n$bodyString")
    } catch (e: IOException) {
        println("body:\n" + e.message)
    }
}

再次执行得到如下结果

body:
[
  {
    "id": 1,
    "title": "json-server",
    "author": "typicode"
  },
  {
    "token": "861bc663-eaea-4bf3-9e93-6c3a818b6929",
    "userId": "107",
    "id": 2
  }
]

OK,完美收官!

靓文参考:https://medium.com/junior-dev/how-to-secure-a-private-ip-address-with-https-nginx-ubuntu-ef8374dbfa4e

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容