首页 > 系统相关 >【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)

【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)

时间:2024-06-01 09:33:16浏览次数:16  
标签:return string Service App Linux cert thumbprint var

在前一篇文章中,我们是把.NET 8应用读取SSL证书(X509)示例部署在App Service Windows环境中,那么如果部署在Linux环境,以及Linux Container中呢?

根据前文中的第一种方法,直接在把证书文件包含在源文件中,通过相对路径读取证书文件的方式,经测试,可以正常工作。

但是,对于第二种“通过指纹在系统证书库中查找证书 ”的方式,在Linux系统中,是不能使用 X509Store(StoreName.My, StoreLocation.CurrentUser) 中查找的方式。

经过测试验证,在App Service Linux( 包含Linux Container)证书页面上传的证书后,系统会把证书保存为文件。存储在 /var/ssl/ 文件夹中,可以通过ssh 方式查看:

  1. 进入App Service Kudu(高级工具)页面: https://<yourwebappname>.scm.chinacloudsites.cn/webssh/host 
  2. 点击SSH目录,输入cd 目录命令: cd /var/ssl/private 后,列举全部文件: ls -ll

 

在.NET 8代码中的正确读取私有证书 (.pfx)的代码示例:

    public static string FindPfxbyThubmprintinLinux(string thumbprint)
    {
        if (string.IsNullOrEmpty(thumbprint))
            return $"Certificate with thumbprint {thumbprint} was not found";

        string finalPath = $"/var/ssl/private/{thumbprint}.p12";
        var bytes2 = File.ReadAllBytes(finalPath);
        var cert = new X509Certificate2(bytes2);
        return cert.ToString(); 
    }

注意:

  • WEBSITE_LOAD_CERTIFICATES  配置不可少
  • 门户上的证书添加后,需要重启站点,等待实例中出现证书文件。(通常在15分钟左右后才能在目录中看见 thumbprint.p12文件)

 

附录:示例代码(.NET 8.0 顶级语句 program.cs)

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.FileProviders;
using System.Security.Cryptography.X509Certificates;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

var app = builder.Build();

// Configure the HTTP request pipeline.

app.UseHttpsRedirection();

app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "Images")),
    RequestPath = new PathString("/Images")
});



app.MapGet("/loadpfxbyname", ([FromQuery(Name = "name")] string filename, [FromQuery(Name = "pwd")] string pwd) =>
{
    var content = pfxTesting.LoadPfx(filename, pwd);
    return content;
});

app.MapGet("/loadpfx/{pwd}", (string pwd) =>
{

    var content = pfxTesting.LoadPfx(null, pwd);
    return content;
});

app.MapGet("/findpfx/{certThumbprint}", (string certThumbprint) =>
{

    var content = pfxTesting.FindPfx(certThumbprint);
    return content;
});



app.Run();

class pfxTesting
{
    public static string LoadPfx(string? filename, string password = "")
    {
        try
        {
            if (filename == null) filename = "contoso.com.pfx";

            var bytes = File.ReadAllBytes(filename);
            var cert = new X509Certificate2(bytes, password);

            return cert.ToString();
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

    public static string FindPfx(string certThumbprint = "")
    {
        try
        {
            bool validOnly = false;
            using (X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser))
            {
                certStore.Open(OpenFlags.ReadOnly);

                X509Certificate2Collection certCollection = certStore.Certificates.Find(
                                            X509FindType.FindByThumbprint,
                                            // Replace below with your certificate's thumbprint
                                            certThumbprint,
                                            validOnly);
                // Get the first cert with the thumbprint
                X509Certificate2 cert = certCollection.OfType<X509Certificate2>().FirstOrDefault();

                if (cert is null)
                    return FindPfxbyThubmprintinLinux(certThumbprint);
                    //throw new Exception($"Certificate with thumbprint {certThumbprint} was not found");

                return cert.ToString();

            }
        }
        catch (Exception ex) { return ex.Message; }
    }

    public static string FindPfxbyThubmprintinLinux(string thumbprint)
    {
        if (string.IsNullOrEmpty(thumbprint))
            return $"Certificate with thumbprint {thumbprint} was not found";

        string finalPath = $"/var/ssl/private/{thumbprint}.p12";
        var bytes2 = File.ReadAllBytes(finalPath);
        var cert = new X509Certificate2(bytes2);
        return cert.ToString(); 
    }
}

 

 

参考资料

在 Linux/Windows 容器中加载证书 : https://docs.azure.cn/zh-cn/app-service/configure-ssl-certificate-in-code#load-certificate-in-linuxwindows-containers

GetX509CertificateLinux(string thumbprint)  :

https://learn.microsoft.com/en-us/answers/questions/1055731/application-error-on-linux-running-net-core

Load Certificate on Linux Web App #19305 : https://github.com/MicrosoftDocs/azure-docs/issues/19305

 

【END】

 

标签:return,string,Service,App,Linux,cert,thumbprint,var
From: https://www.cnblogs.com/lulight/p/18225557

相关文章

  • 基于ssm框架的app信息管理平台的设计与实现论文
    APP信息管理平台是一个功能强大的综合性管理平台,旨在为用户提供全面、便捷的公告信息、APP信息以及APP下载管理服务。在APP信息管理方面,平台提供了APP信息的上传、更新、维护等功能。用户可以轻松管理APP的基本信息、版本更新、功能介绍等内容,确保用户能够随时获取到最新......
  • Web Service和Web API
    WebService和WebAPIWebService理解:WebService是一种基于网络的服务,它使用标准化的消息传递协议,最典型的是基于 SOAP(SimpleObjectAccessProtocol)协议。SOAP使用 XML格式封装数据,定义了消息的结构和传输方式,因此它是一个重量级的解决方案。WebService 支持跨平台、......
  • 07Linux学习笔记
    Day7Linux网络管理目录文章目录Day7Linux网络管理1.查看Windows网络配置(ipconfig)2.查看Linux网络配置3.指定LinuxIP方法一:3.1查看所有网络连接3.2修改指定网络连接的IP地址3.3重新启动网络连接方法二:3.4找到要编辑的文件3.5编辑完配置文件后,应用更改:4.主机名和......
  • 08Linux文件共享设置
    Linux共享文件目录文章目录Linux共享文件1.windows新建共享文件夹2.Ubuntu安装VMwaretools3.解压3.1运行安装并配置VMwaretools4.进入root5.进入hgfs文件夹6.挂载7.验证8.文件管理器中无法正常访问hgfs(在终端中可以)![请添加图片描述](https://img-blog.csdnimg.cn/d......
  • Ubuntu server 24 (Linux) Snort3 3.2.1.0 Guardian IPtables 联动实战 主动防御系统(
    一  Snort3安装配置,参考:Ubuntuserver24安装配置snort33.2.1.0网络入侵检测防御系统配置注册规则集-CSDN博客二  安装主动防御程序Guardian1下载,解压tarzxvfguardian-1.7.tar.gzcdguardian-1.7/2 配置#拷贝文件sudocpguardian.pl/usr/local/bin/......
  • uniapp使用EventBus实现页面间数据传递
    前情最近在做小程序项目,选用是当前比较火的uniapp技术栈,经常会遇到页面间消息传递的需求。为什么要这么做?uniapp页面间数据通信方式有很多:通过url传参,状态管理库vuex/pinia,本地存储,事件通道eventChannel,EventBus等,这次的需求是在A面点击一个按钮跳转到B页面拾取一个数据选项再......
  • 适用于linux的bilibiliB站直播间弹幕爬虫脚本
    适用于linux的bilibiliB站直播间弹幕爬虫脚本,命令行运行之,输入到命令行,部分内容参考自网络,代码底部可见原始代码出处BUFF:然而,经测试,每次爬只能读取10条弹幕记录,这就使得在(sleeptime*10)(每秒)<弹幕新增量(每秒)时出现弹幕丢失的情况,此时需要调短sleeptime,由于本脚本是......
  • Linux压缩、解压缩指令
    tar【tar指令是打包指令,最后打包后的文件是.tar.gz文件】 案例1:压缩多个文件,将/home/pig.txt和/home/cat.txt压缩成pc.tar.gztar-zcvfpc.tar.gz/home/pig.txt/home/cat.txt案例2:将/home的文件夹压缩成myhome.tar.gztar-zcvfmyhome.tar.gz/hom......
  • Linux下的并发与竞争
    文章目录前言一、原子操作二、自旋锁三、读写自旋锁四、信号量五、互斥体总结前言Linux系统是个多任务操作系统,并发访问带来的问题就是竞争,所谓的临界区就是共享数据段,要保证临界区是原子访问的。主要方法有四种:原子操作,自旋锁,信号量,互斥体。本文主要介绍内核下各方......
  • linux 文件属性被替换修改查询并修改
    系统服务发布本来非常正常,但是今天不知道为什么,打包发布异常,删除文件目录的权限都没有。上网搜索后,最终找到文件属性被修改,导致无法删除。通过lsattr命令查询文件的属性,如果出现,其中----i-----------的文件是属性被修改的。查找文件时,注意,隐藏文件也要查询。[root@localhost......