@@ -100,8 +100,10 @@ func (c *WSClient) handleMessage(resp *deployPB.NotifyResponse) {
100100 }
101101
102102 case deployPB .Type_CHALLENGE :
103- if businesResp , ok := resp .Data .(* deployPB.NotifyResponse_ExecuteBusinesResponse ); ok {
104- go c .handleChallenge (businesResp .ExecuteBusinesResponse )
103+ if challengeReq , ok := resp .Data .(* deployPB.NotifyResponse_ChallengeRequest ); ok {
104+ go c .handleChallenge (resp .RequestId , challengeReq .ChallengeRequest )
105+ } else if businesResp , ok := resp .Data .(* deployPB.NotifyResponse_ExecuteBusinesResponse ); ok {
106+ go c .handleLegacyChallenge (businesResp .ExecuteBusinesResponse )
105107 }
106108
107109 case deployPB .Type_EXECUTE_BUSINES :
@@ -165,8 +167,46 @@ func (c *WSClient) handleUpdate() {
165167 updateHandler .HandleUpdate ()
166168}
167169
168- // handleChallenge 处理 ACME HTTP-01 challenge
169- func (c * WSClient ) handleChallenge (resp * deployPB.ExecuteBusinesResponse ) {
170+ // handleChallenge 执行 HTTP-01 challenge 请求并返回同 requestId 的 ACK。
171+ func (c * WSClient ) handleChallenge (requestID string , request * deployPB.ChallengeRequest ) {
172+ result , message := c .executeChallengeRequest (request )
173+ c .sendChallengeResponse (requestID , request , result , message )
174+ }
175+
176+ // executeChallengeRequest 校验并执行一条设置或删除 challenge 的请求。
177+ func (c * WSClient ) executeChallengeRequest (request * deployPB.ChallengeRequest ) (deployPB.ChallengeResponse_Result , string ) {
178+ if request == nil {
179+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_FAILED , "challenge 请求为空"
180+ }
181+ if request .OperationId <= 0 || request .CertId <= 0 || request .Domain == "" || request .Token == "" {
182+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_FAILED , "challenge 请求参数不完整"
183+ }
184+ if c .httpServer == nil {
185+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_FAILED , "HTTP-01 服务未初始化"
186+ }
187+
188+ switch request .Action {
189+ case deployPB .ChallengeRequest_CHALLENGE_ACTION_SET :
190+ if err := c .httpServer .SetChallenge (request .Token , request .KeyAuth , request .Domain ); err != nil {
191+ logger .Error ("设置 Challenge 失败" , "error" , err , "operationId" , request .OperationId , "certId" , request .CertId , "domain" , request .Domain )
192+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_FAILED , err .Error ()
193+ }
194+ logger .Info ("设置 Challenge" , "operationId" , request .OperationId , "certId" , request .CertId , "token" , request .Token , "domain" , request .Domain )
195+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_SUCCESS , "challenge 已缓存"
196+ case deployPB .ChallengeRequest_CHALLENGE_ACTION_DELETE :
197+ if err := c .httpServer .RemoveChallenge (request .Token ); err != nil {
198+ logger .Error ("删除 Challenge 失败" , "error" , err , "operationId" , request .OperationId , "certId" , request .CertId , "domain" , request .Domain )
199+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_FAILED , err .Error ()
200+ }
201+ logger .Info ("删除 Challenge" , "operationId" , request .OperationId , "certId" , request .CertId , "token" , request .Token , "domain" , request .Domain )
202+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_SUCCESS , "challenge 已删除"
203+ default :
204+ return deployPB .ChallengeResponse_CHALLENGE_RESULT_NOT_SUPPORTED , "不支持的 challenge 操作"
205+ }
206+ }
207+
208+ // handleLegacyChallenge 兼容处理旧服务端复用业务消息发送的 challenge。
209+ func (c * WSClient ) handleLegacyChallenge (resp * deployPB.ExecuteBusinesResponse ) {
170210 token := resp .ChallengeToken
171211 challengeResp := resp .ChallengeResponse
172212 domain := resp .Domain
@@ -183,13 +223,19 @@ func (c *WSClient) handleChallenge(resp *deployPB.ExecuteBusinesResponse) {
183223
184224 // 如果 challengeResp 为空,表示后端要求删除此 challenge(过期/取消)
185225 if challengeResp == "" {
186- c .httpServer .RemoveChallenge (token )
226+ if err := c .httpServer .RemoveChallenge (token ); err != nil {
227+ logger .Error ("删除旧版 Challenge 失败" , "error" , err , "token" , token , "domain" , domain )
228+ return
229+ }
187230 logger .Info ("删除Challenge" , "token" , token , "domain" , domain )
188231 return
189232 }
190233
191234 // 正常情况:缓存新的 challenge
192- c .httpServer .SetChallenge (token , challengeResp , domain )
235+ if err := c .httpServer .SetChallenge (token , challengeResp , domain ); err != nil {
236+ logger .Error ("设置旧版 Challenge 失败" , "error" , err , "token" , token , "domain" , domain )
237+ return
238+ }
193239 logger .Info ("设置Challenge" , "token" , token , "domain" , domain )
194240}
195241
0 commit comments