You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用证书实现Java Web应用与Azure AD连接(无需client Secret)

Java Web应用仅用证书认证对接Azure AD实现方案

整个实现不需要配置client secret,全程通过非对称证书完成客户端身份校验,分Azure侧配置、项目依赖引入、代码配置三个核心步骤,具体操作如下:

一、Azure AD应用注册前置配置

  • 进入Azure AD的应用注册页面,新建对应Java Web应用的注册条目,平台类型选择「Web」,重定向URI填写你项目实际的登录回调地址(比如http://localhost:8080/login/oauth2/code/)
  • 提前生成用于认证的非对称证书:本地用JDK自带的keytool生成即可,命令如下:
    keytool -genkeypair -alias azuread-auth -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore azure-ad-auth.pfx -validity 365
    执行命令时按提示设置keystore密码,生成后导出公钥文件(.cer格式),将公钥文件上传到应用注册页的「证书和密码」-「证书」板块,上传完成后记录页面显示的证书指纹
  • 按业务需求配置API权限,如果需要访问Microsoft Graph或者其他受Azure AD保护的接口,添加对应委派/应用权限后点击「授予管理员同意」
  • 记录三个核心参数:Azure AD租户ID(Tenant ID)、应用客户端ID(Client ID)、证书存储密码

注意:上传到Azure AD的是不带私钥的公钥.cer文件,项目侧使用带私钥的.pfx文件,不要搞混;私钥文件严禁提交到公开代码仓库。

二、项目依赖引入

根据你项目的技术栈选对应的官方SDK即可,不要自己手写OAuth2流程和JWT签名逻辑,避免出现格式兼容、签名校验失败的问题:

  • 如果是Spring Boot技术栈,直接引入微软官方维护的Azure AD Spring Starter:
<dependency>
    <groupId>com.azure.spring</groupId>
    <artifactId>azure-spring-boot-starter-active-directory</artifactId>
    <version>选择对应Spring Boot版本匹配的稳定版即可</version>
</dependency>
  • 如果是Servlet原生或者其他框架的Java Web项目,引入MSAL4J(Microsoft Authentication Library for Java)依赖即可:
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>msal4j</artifactId>
    <version>最新稳定版</version>
</dependency>

三、核心配置与代码实现

3.1 Spring Boot场景

直接在application.yml中填写配置即可,不需要配置client-secret字段,SDK会自动加载证书完成客户端身份签名:

azure:
  activedirectory:
    tenant-id: 之前记录的租户ID
    client-id: 之前记录的客户端ID
    client-certificate:
      path: 服务器上pfx私钥证书的绝对路径
      password: 生成证书时设置的keystore密码
    # 按需配置需要访问的资源权限范围
    authorized-clients:
      graph:
        scopes: https://graph.microsoft.com/User.Read

配置完成后加常规的Spring Security拦截规则,将需要登录认证的路径配置为authenticated,SDK会自动拦截未登录请求跳转到Azure AD登录页,认证完成后回调回项目,全程自动处理令牌申请、校验逻辑。

3.2 非Spring原生Java Web场景

通过MSAL4J构建ConfidentialClientApplication实例时,传入证书作为客户端凭证即可,核心代码示例:

import com.microsoft.aad.msal4j.*;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.X509Certificate;

// 加载pfx私钥证书
KeyStore keystore = KeyStore.getInstance("PKCS12");
try (FileInputStream certIs = new FileInputStream("你的pfx证书存储路径")) {
    keystore.load(certIs, "证书密码".toCharArray());
}
PrivateKey privateKey = (PrivateKey) keystore.getKey("azuread-auth", "证书密码".toCharArray());
X509Certificate publicCert = (X509Certificate) keystore.getCertificate("azuread-auth");

// 构建证书类型的客户端凭证,替代client secret
IClientCredential certCredential = ClientCredentialFactory.createFromCertificate(privateKey, publicCert);
ConfidentialClientApplication authClient = ConfidentialClientApplication
        .builder("你的客户端ID", certCredential)
        // 全球版Azure用https://login.microsoftonline.com/租户ID/,国内世纪互联版用https://login.partner.microsoftonline.cn/租户ID/
        .authority("https://login.microsoftonline.com/你的租户ID/")
        .build();

// 后续走标准OAuth2授权码流程即可:用户跳转到Azure AD登录授权后拿到code,调用authClient.acquireToken方法传入授权码、回调地址即可申请访问令牌

四、常见排错点

  • 证书密钥长度不能低于2048位,签名算法要求SHA256及以上,否则Azure AD会直接拒绝认证请求
  • 如果报客户端身份校验失败,先核对项目侧使用的私钥证书和上传到Azure AD的公钥证书是否为一对,证书指纹是否和Azure AD页面显示的完全一致
  • 回调地址必须和Azure AD应用注册中配置的重定向URI完全匹配,包括协议(http/https)、端口、路径,不能有多余的斜杠或者参数
  • 生产环境建议将pfx私钥证书存储在专用密钥管理服务中,运行时动态加载,不要明文写在配置文件里,避免私钥泄露

内容的提问来源于stack exchange,提问作者Curious_Soul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:27:19