1
0
mirror of https://github.com/eclipse/mosquitto.git synced 2025-04-19 10:22:16 +03:00

Merge branch 'fixes'

This commit is contained in:
Roger A. Light 2025-03-06 15:04:13 +00:00
commit 1c6a813e6f
114 changed files with 1953 additions and 1314 deletions

View File

@ -13,7 +13,7 @@ name: "CodeQL"
on:
push:
branches: [ master, fixes, develop, 1.6.x ]
branches: [ master, fixes, develop ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master ]
@ -35,11 +35,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@ -64,4 +64,4 @@ jobs:
- run: make binary
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v3

View File

@ -9,7 +9,7 @@ jobs:
coverity:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
ref: develop

View File

@ -9,7 +9,7 @@ jobs:
coverity:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
ref: fixes

View File

@ -10,12 +10,12 @@ permissions:
pull-requests: write
concurrency:
group: lock
group: lock-threads
jobs:
action:
runs-on: ubuntu-latest
steps:
- uses: dessant/lock-threads@v3
- uses: dessant/lock-threads@v5
with:
issue-inactive-days: '90'

53
.github/workflows/windows-x86.yml vendored Normal file
View File

@ -0,0 +1,53 @@
name: Windows x86 build
on:
workflow_dispatch:
push:
branches: [ "master", "fixes", "develop" ]
tags: [ "v[0-9]+.*" ]
pull_request:
branches: [ "master", "fixes", "develop" ]
env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
BUILD_TYPE: Release
jobs:
mosquitto:
runs-on: windows-2022
steps:
- uses: actions/checkout@v4
- name: vcpkg build
uses: johnwason/vcpkg-action@v6
id: vcpkg
with:
manifest-dir: ${{ github.workspace }}
triplet: x86-windows
token: ${{ github.token }}
github-binarycache: true
- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DWITH_WEBSOCKETS=ON -DWITH_TESTS=OFF -DCMAKE_GENERATOR_PLATFORM=WIN32 -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x86-windows -DVCPKG_MANIFEST_MODE=ON
- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}
- uses: suisei-cn/actions-download-file@v1.6.0
id: vcredist
name: Download VC redistributable
with:
url: https://aka.ms/vs/17/release/vc_redist.x86.exe
target: ${{github.workspace}}/installer/
- name: Installer
uses: joncloud/makensis-action@v4
with:
script-file: ${{github.workspace}}/installer/mosquitto.nsi
- name: Upload installer to artifacts
uses: actions/upload-artifact@v4
with:
name: installer
path: ${{ github.workspace }}/installer/mosquitto*.exe

View File

@ -30,7 +30,7 @@ jobs:
github-binarycache: true
- name: Configure CMake
run: cmake -B ${{github.workspace}}/build64 -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DWITH_LIBWEBSOCKETS=ON -DWITH_TESTS=OFF -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release -DVCPKG_MANIFEST_MODE=ON
run: cmake -B ${{github.workspace}}/build64 -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DWITH_WEBSOCKETS=ON -DWITH_TESTS=OFF -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release -DVCPKG_MANIFEST_MODE=ON
- name: Build
run: cmake --build ${{github.workspace}}/build64 --config ${{env.BUILD_TYPE}}

View File

@ -4,11 +4,10 @@
# To configure the build options either use the CMake gui, or run the command
# line utility including the "-i" option.
cmake_minimum_required(VERSION 3.5)
cmake_policy(SET CMP0042 NEW)
cmake_minimum_required(VERSION 3.18)
project(mosquitto)
set (VERSION 2.0.20)
set (VERSION 2.0.21)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")

View File

@ -1,3 +1,39 @@
2.0.21 - 2024-xx-xx
===================
Broker:
- Fix clients sending a RESERVED packet not being quickly disconnected.
Closes #2325.
- Fix `bind_interface` producing an error when used with an interface that has
an IPv6 link-local address and no other IPv6 addresses. Closes #2696.
- Fix mismatched wrapped/unwrapped memory alloc/free in properties. Closes #3192.
- Fix `allow_anonymous false` not being applied in local only mode. Closes #3198.
- Add `retain_expiry_interval` option to fix expired retained message not
being removed from memory if they are not subscribed to. Closes #3221.
- Produce an error if invalid combinations of cafile/capath/certfile/keyfile
are used. Closes #1836. Closes #3130.
- Backport keepalive checking from develop to fix problems in current
implementation. Closes #3138.
Client library:
- Fix potential deadlock in mosquitto_sub if `-W` is used. Closes #3175.
Apps:
- mosquitto_ctrl dynsec now also allows `-i` to specify a clientid as well as
`-c`. This matches the documentation which states `-i`. Closes #3219.
Client library:
- Fix threads linking on Windows for static libmosquitto library
Closes #3143
Build:
- Fix Windows builds not having websockets enabled.
- Add tzdata to docker images
Tests:
- Fix 08-ssl-connect-cert-auth-expired and 08-ssl-connect-cert-auth-revoked
tests when under load. Closes #3208.
2.0.20 - 2024-10-16
===================

View File

@ -21,6 +21,10 @@ OBJS = \
util_topic.o \
utf8_mosq.o
ifeq ($(UNAME),Linux)
LIBS:=$(LIBS) -lrt
endif
.PHONY: all clean reallyclean
all : mosquitto_db_dump

View File

@ -127,7 +127,11 @@ int client_request_response(struct mosq_ctrl *ctrl)
int rc;
time_t start;
if(ctrl->cfg.cafile == NULL && ctrl->cfg.capath == NULL){
if(ctrl->cfg.cafile == NULL && ctrl->cfg.capath == NULL && !ctrl->cfg.tls_use_os_certs && ctrl->cfg.port != 8883
# ifdef FINAL_WITH_TLS_PSK
&& !ctrl->cfg.psk
# endif
){
fprintf(stderr, "Warning: You are running mosquitto_ctrl without encryption.\nThis means all of the configuration changes you are making are visible on the network, including passwords.\n\n");
}

View File

@ -49,7 +49,7 @@ void dynsec__print_usage(void)
printf("Set group for anonymous clients: setAnonymousGroup <groupname>\n");
printf("\nClients\n-------\n");
printf("Create a new client: createClient <username> [-c clientid] [-p password]\n");
printf("Create a new client: createClient <username> [-i clientid] [-p password]\n");
printf("Delete a client: deleteClient <username>\n");
printf("Set a client password: setClientPassword <username> [password]\n");
printf("Set a client id: setClientId <username> [clientid]\n");

View File

@ -40,9 +40,9 @@ int dynsec_client__create(int argc, char *argv[], cJSON *j_command)
username = argv[0];
for(i=1; i<argc; i++){
if(!strcmp(argv[i], "-c")){
if(!strcmp(argv[i], "-c") || !strcmp(argv[i], "-i")){
if(i+1 == argc){
fprintf(stderr, "Error: -c argument given, but no clientid provided.\n");
fprintf(stderr, "Error: -i argument given, but no clientid provided.\n");
return MOSQ_ERR_INVAL;
}
clientid = argv[i+1];

View File

@ -51,6 +51,7 @@ struct mosq_config {
char *tls_engine;
char *tls_engine_kpass_sha1;
char *keyform;
bool tls_use_os_certs;
# ifdef FINAL_WITH_TLS_PSK
char *psk;
char *psk_identity;

View File

@ -247,6 +247,7 @@ static int client_config_line_proc(struct mosq_config *cfg, int *argc, char **ar
} else if(!strncasecmp(url, "mqtts://", 8)) {
url += 8;
cfg->port = 8883;
cfg->tls_use_os_certs = true;
} else {
fprintf(stderr, "Error: unsupported URL scheme.\n\n");
return 1;
@ -388,6 +389,8 @@ static int client_config_line_proc(struct mosq_config *cfg, int *argc, char **ar
}
argv++;
(*argc)--;
}else if(!strcmp(argv[0], "--tls-use-os-certs")){
cfg->tls_use_os_certs = true;
}else if(!strcmp(argv[0], "--tls-version")){
if((*argc) == 1){
fprintf(stderr, "Error: --tls-version argument given but no version specified.\n\n");
@ -609,7 +612,21 @@ int client_opts_set(struct mosquitto *mosq, struct mosq_config *cfg)
mosquitto_lib_cleanup();
return 1;
}
}
# ifdef FINAL_WITH_TLS_PSK
}else if (cfg->psk){
if(mosquitto_tls_psk_set(mosq, cfg->psk, cfg->psk_identity, NULL)){
fprintf(stderr, "Error: Problem setting TLS-PSK options.\n");
mosquitto_lib_cleanup();
return 1;
}
# endif
}else if(cfg->port == 8883){
mosquitto_int_option(mosq, MOSQ_OPT_TLS_USE_OS_CERTS, 1);
}
if(cfg->tls_use_os_certs){
mosquitto_int_option(mosq, MOSQ_OPT_TLS_USE_OS_CERTS, 1);
}
if(cfg->insecure && mosquitto_tls_insecure_set(mosq, true)){
fprintf(stderr, "Error: Problem setting TLS insecure option.\n");
mosquitto_lib_cleanup();
@ -630,13 +647,6 @@ int client_opts_set(struct mosquitto *mosq, struct mosq_config *cfg)
mosquitto_lib_cleanup();
return 1;
}
# ifdef FINAL_WITH_TLS_PSK
if(cfg->psk && mosquitto_tls_psk_set(mosq, cfg->psk, cfg->psk_identity, NULL)){
fprintf(stderr, "Error: Problem setting TLS-PSK options.\n");
mosquitto_lib_cleanup();
return 1;
}
# endif
if((cfg->tls_version || cfg->ciphers) && mosquitto_tls_opts_set(mosq, 1, cfg->tls_version, cfg->ciphers)){
fprintf(stderr, "Error: Problem setting TLS options, check the options are valid.\n");
mosquitto_lib_cleanup();

View File

@ -120,6 +120,10 @@ WITH_JEMALLOC:=no
# probably of no particular interest to end users.
WITH_XTREPORT=no
# Use the old O(n) keepalive check routine, instead of the new O(1) keepalive
# check routine. See src/keepalive.c for notes on this.
WITH_OLD_KEEPALIVE=no
# Build using clang and with address sanitiser enabled
WITH_ASAN=no
@ -130,7 +134,7 @@ WITH_ASAN=no
# Also bump lib/mosquitto.h, CMakeLists.txt,
# installer/mosquitto.nsi, installer/mosquitto64.nsi
VERSION=2.0.20
VERSION=2.0.21
# Client library SO version. Bump if incompatible API/ABI changes are made.
SOVERSION=1
@ -388,6 +392,10 @@ ifeq ($(WITH_XTREPORT),yes)
BROKER_CFLAGS:=$(BROKER_CFLAGS) -DWITH_XTREPORT
endif
ifeq ($(WITH_OLD_KEEPALIVE),yes)
BROKER_CPPFLAGS:=$(BROKER_CPPFLAGS) -DWITH_OLD_KEEPALIVE
endif
BROKER_LDADD:=${BROKER_LDADD} ${LDADD}
CLIENT_LDADD:=${CLIENT_LDADD} ${LDADD}
PASSWD_LDADD:=${PASSWD_LDADD} ${LDADD}

View File

@ -82,7 +82,9 @@ RUN set -x && \
install -m644 /build/mosq/mosquitto.conf /mosquitto/config/mosquitto.conf && \
chown -R mosquitto:mosquitto /mosquitto && \
apk --no-cache add \
ca-certificates libuuid && \
ca-certificates \
libuuid \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -82,7 +82,8 @@ RUN set -x && \
apk --no-cache add \
ca-certificates \
libressl \
libuuid && \
libuuid \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -86,7 +86,8 @@ RUN set -x && \
install -Dm644 /build/mosq/edl-v10 /usr/share/licenses/mosquitto/edl-v10 && \
chown -R mosquitto:mosquitto /mosquitto && \
apk --no-cache add \
ca-certificates && \
ca-certificates \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -88,7 +88,8 @@ RUN set -x && \
chown -R mosquitto:mosquitto /mosquitto && \
apk --no-cache add \
ca-certificates \
libressl && \
libressl \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -90,7 +90,8 @@ RUN set -x && \
chown -R mosquitto:mosquitto /mosquitto && \
apk --no-cache add \
ca-certificates \
cjson && \
cjson \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -71,6 +71,19 @@ to expose the ports that have been configured, for example:
docker run -it -p 1883:1883 -p 8080:8080 -v <absolute-path-to-configuration-file>:/mosquitto/config/mosquitto.conf eclipse-mosquitto:<version>
```
**Important**: The default configuration only listens on the loopback
interface. This means that there is no way to access Mosquitto in the docker
container without using a custom configuration containing at least a listener.
You also need to make a decision to allow anonymous connections or to set up a
different method of client authentication.
i.e. to configure a Mosquitto docker container as if it was running locally,
add the following to `mosquitto.conf`:
```
listener 1883
allow_anonymous true
```
Configuration can be changed to:
* persist data to `/mosquitto/data`

View File

@ -92,7 +92,8 @@ RUN set -x && \
apk --no-cache add \
ca-certificates \
cjson \
libressl && \
libressl \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -71,6 +71,20 @@ to expose the ports that have been configured, for example:
docker run -it -p 1883:1883 -p 8080:8080 -v <absolute-path-to-configuration-file>:/mosquitto/config/mosquitto.conf eclipse-mosquitto:<version>
```
**Important**: The default configuration only listens on the loopback
interface. This means that there is no way to access Mosquitto in the docker
container without using a custom configuration containing at least a listener.
You also need to make a decision to allow anonymous connections or to set up a
different method of client authentication.
i.e. to configure a Mosquitto docker container as if it was running locally,
add the following to `mosquitto.conf`:
```
listener 1883
allow_anonymous true
```
Configuration can be changed to:
* persist data to `/mosquitto/data`

View File

@ -118,7 +118,8 @@ RUN set -x && \
install -Dm644 /build/mosq/edl-v10 /usr/share/licenses/mosquitto/edl-v10 && \
chown -R mosquitto:mosquitto /mosquitto && \
apk --no-cache add \
ca-certificates && \
ca-certificates \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -58,3 +58,16 @@ docker run -it -p 1883:1883 -v <path-to-configuration-file>:/mosquitto/config/mo
:boom: if the mosquitto configuration (mosquitto.conf) was modified
to use non-default ports, the docker run command will need to be updated
to expose the ports that have been configured.
**Important**: The default configuration only listens on the
loopback interface. This means that there is no way to access Mosquitto in the
docker container without using a custom configuration containing at least
a listener. You also need to make a decision to allow anonymous connections or
to set up a different method of client authentication.
i.e. to configure a Mosquitto docker container as if it was running locally,
add the following to `mosquitto.conf`:
```
listener 1883
allow_anonymous true
```

View File

@ -77,7 +77,8 @@ RUN set -x && \
install -Dm644 /build/mosq/edl-v10 /usr/share/licenses/mosquitto/edl-v10 && \
chown -R mosquitto:mosquitto /mosquitto && \
apk --no-cache add \
ca-certificates && \
ca-certificates \
tzdata && \
apk del build-deps && \
rm -rf /build

View File

@ -66,7 +66,7 @@ extern "C" {
#define LIBMOSQUITTO_MAJOR 2
#define LIBMOSQUITTO_MINOR 0
#define LIBMOSQUITTO_REVISION 20
#define LIBMOSQUITTO_REVISION 21
/* LIBMOSQUITTO_VERSION_NUMBER looks like 1002001 for e.g. version 1.2.1. */
#define LIBMOSQUITTO_VERSION_NUMBER (LIBMOSQUITTO_MAJOR*1000000+LIBMOSQUITTO_MINOR*1000+LIBMOSQUITTO_REVISION)
@ -399,8 +399,7 @@ libmosq_EXPORT int mosquitto_will_set(struct mosquitto *mosq, const char *topic,
* before calling <mosquitto_connect>.
*
* If the mosquitto instance `mosq` is using MQTT v5, the `properties` argument
* will be applied to the Will. For MQTT v3.1.1 and below, the `properties`
* argument will be ignored.
* will be applied to the Will.
*
* Set your client to use MQTT v5 immediately after it is created:
*
@ -431,6 +430,8 @@ libmosq_EXPORT int mosquitto_will_set(struct mosquitto *mosq, const char *topic,
* using MQTT v5
* MOSQ_ERR_PROTOCOL - if a property is invalid for use with wills.
* MOSQ_ERR_DUPLICATE_PROPERTY - if a property is duplicated where it is forbidden.
* MOSQ_ERR_NOT_SUPPORTED - if properties is not NULL and the client is not
* using MQTT v5.
*/
libmosq_EXPORT int mosquitto_will_set_v5(struct mosquitto *mosq, const char *topic, int payloadlen, const void *payload, int qos, bool retain, mosquitto_property *properties);
@ -562,8 +563,7 @@ libmosq_EXPORT int mosquitto_connect_bind(struct mosquitto *mosq, const char *ho
* <mosquitto_property_free_all>.
*
* If the mosquitto instance `mosq` is using MQTT v5, the `properties` argument
* will be applied to the CONNECT message. For MQTT v3.1.1 and below, the
* `properties` argument will be ignored.
* will be applied to the CONNECT message.
*
* Set your client to use MQTT v5 immediately after it is created:
*
@ -594,6 +594,8 @@ libmosq_EXPORT int mosquitto_connect_bind(struct mosquitto *mosq, const char *ho
* Windows.
* MOSQ_ERR_DUPLICATE_PROPERTY - if a property is duplicated where it is forbidden.
* MOSQ_ERR_PROTOCOL - if any property is invalid for use with CONNECT.
* MOSQ_ERR_NOT_SUPPORTED - if properties is not NULL and the client is not
* using MQTT v5.
*
* See Also:
* <mosquitto_connect>, <mosquitto_connect_async>, <mosquitto_connect_bind_async>
@ -795,8 +797,7 @@ libmosq_EXPORT int mosquitto_disconnect(struct mosquitto *mosq);
* <mosquitto_property_free_all>.
*
* If the mosquitto instance `mosq` is using MQTT v5, the `properties` argument
* will be applied to the DISCONNECT message. For MQTT v3.1.1 and below, the
* `properties` argument will be ignored.
* will be applied to the DISCONNECT message.
*
* Set your client to use MQTT v5 immediately after it is created:
*
@ -813,6 +814,8 @@ libmosq_EXPORT int mosquitto_disconnect(struct mosquitto *mosq);
* MOSQ_ERR_NO_CONN - if the client isn't connected to a broker.
* MOSQ_ERR_DUPLICATE_PROPERTY - if a property is duplicated where it is forbidden.
* MOSQ_ERR_PROTOCOL - if any property is invalid for use with DISCONNECT.
* MOSQ_ERR_NOT_SUPPORTED - if properties is not NULL and the client is not
* using MQTT v5.
*/
libmosq_EXPORT int mosquitto_disconnect_v5(struct mosquitto *mosq, int reason_code, const mosquitto_property *properties);
@ -879,8 +882,7 @@ libmosq_EXPORT int mosquitto_publish(struct mosquitto *mosq, int *mid, const cha
* <mosquitto_property_free_all>.
*
* If the mosquitto instance `mosq` is using MQTT v5, the `properties` argument
* will be applied to the PUBLISH message. For MQTT v3.1.1 and below, the
* `properties` argument will be ignored.
* will be applied to the PUBLISH message.
*
* Set your client to use MQTT v5 immediately after it is created:
*
@ -920,6 +922,8 @@ libmosq_EXPORT int mosquitto_publish(struct mosquitto *mosq, int *mid, const cha
* the broker.
* MOSQ_ERR_OVERSIZE_PACKET - if the resulting packet would be larger than
* supported by the broker.
* MOSQ_ERR_NOT_SUPPORTED - if properties is not NULL and the client is not
* using MQTT v5.
*/
libmosq_EXPORT int mosquitto_publish_v5(
struct mosquitto *mosq,
@ -971,8 +975,7 @@ libmosq_EXPORT int mosquitto_subscribe(struct mosquitto *mosq, int *mid, const c
* <mosquitto_property_free_all>.
*
* If the mosquitto instance `mosq` is using MQTT v5, the `properties` argument
* will be applied to the PUBLISH message. For MQTT v3.1.1 and below, the
* `properties` argument will be ignored.
* will be applied to the PUBLISH message.
*
* Set your client to use MQTT v5 immediately after it is created:
*
@ -1000,6 +1003,8 @@ libmosq_EXPORT int mosquitto_subscribe(struct mosquitto *mosq, int *mid, const c
* MOSQ_ERR_PROTOCOL - if any property is invalid for use with SUBSCRIBE.
* MOSQ_ERR_OVERSIZE_PACKET - if the resulting packet would be larger than
* supported by the broker.
* MOSQ_ERR_NOT_SUPPORTED - if properties is not NULL and the client is not
* using MQTT v5.
*/
libmosq_EXPORT int mosquitto_subscribe_v5(struct mosquitto *mosq, int *mid, const char *sub, int qos, int options, const mosquitto_property *properties);
@ -1076,8 +1081,7 @@ libmosq_EXPORT int mosquitto_unsubscribe(struct mosquitto *mosq, int *mid, const
* <mosquitto_property_free_all>.
*
* If the mosquitto instance `mosq` is using MQTT v5, the `properties` argument
* will be applied to the PUBLISH message. For MQTT v3.1.1 and below, the
* `properties` argument will be ignored.
* will be applied to the PUBLISH message.
*
* Set your client to use MQTT v5 immediately after it is created:
*
@ -1103,6 +1107,8 @@ libmosq_EXPORT int mosquitto_unsubscribe(struct mosquitto *mosq, int *mid, const
* MOSQ_ERR_PROTOCOL - if any property is invalid for use with UNSUBSCRIBE.
* MOSQ_ERR_OVERSIZE_PACKET - if the resulting packet would be larger than
* supported by the broker.
* MOSQ_ERR_NOT_SUPPORTED - if properties is not NULL and the client is not
* using MQTT v5.
*/
libmosq_EXPORT int mosquitto_unsubscribe_v5(struct mosquitto *mosq, int *mid, const char *sub, const mosquitto_property *properties);

View File

@ -34,6 +34,7 @@ Contributors:
/* Message types */
#define CMD_RESERVED 0x00U
#define CMD_CONNECT 0x10U
#define CMD_CONNACK 0x20U
#define CMD_PUBLISH 0x30U

View File

@ -9,7 +9,7 @@
!define env_hklm 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
Name "Eclipse Mosquitto"
!define VERSION 2.0.20
!define VERSION 2.0.21
OutFile "mosquitto-${VERSION}-install-windows-x86.exe"
InstallDir "$PROGRAMFILES\mosquitto"
@ -47,8 +47,8 @@ Section "Files" SecInstall
SetOutPath "$INSTDIR"
File "..\logo\mosquitto.ico"
File "..\build\src\Release\mosquitto.exe"
File "..\build\apps\mosquitto_passwd\Release\mosquitto_passwd.exe"
File "..\build\apps\mosquitto_ctrl\Release\mosquitto_ctrl.exe"
File "..\build\apps\mosquitto_passwd\Release\mosquitto_passwd.exe"
File "..\build\client\Release\mosquitto_pub.exe"
File "..\build\client\Release\mosquitto_sub.exe"
File "..\build\client\Release\mosquitto_rr.exe"
@ -63,12 +63,17 @@ Section "Files" SecInstall
File "..\README.md"
File "..\README-windows.txt"
File "..\README-letsencrypt.md"
;File "C:\pthreads\Pre-built.2\dll\x86\pthreadVC2.dll"
File "C:\OpenSSL-Win32\bin\libssl-1_1.dll"
File "C:\OpenSSL-Win32\bin\libcrypto-1_1.dll"
File "..\SECURITY.md"
File "..\edl-v10"
File "..\epl-v20"
File "..\build\vcpkg_installed\x86-windows\bin\cjson.dll"
File "..\build\vcpkg_installed\x86-windows\bin\libcrypto-3.dll"
File "..\build\vcpkg_installed\x86-windows\bin\libssl-3.dll"
File "..\build\vcpkg_installed\x86-windows\bin\pthreadVC3.dll"
File "..\build\vcpkg_installed\x86-windows\bin\uv.dll"
File "..\build\vcpkg_installed\x86-windows\bin\websockets.dll"
SetOutPath "$INSTDIR\devel"
File "..\build\lib\Release\mosquitto.lib"
File "..\build\lib\cpp\Release\mosquittopp.lib"
@ -93,6 +98,13 @@ Section "Files" SecInstall
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
SectionEnd
Section "Visual Studio Runtime"
SetOutPath "$INSTDIR"
File "VC_redist.x86.exe"
ExecWait '"$INSTDIR\VC_redist.x86.exe" /quiet /norestart'
Delete "$INSTDIR\VC_redist.x86.exe"
SectionEnd
Section "Service" SecService
ExecWait '"$INSTDIR\mosquitto.exe" install'
ExecWait 'sc start mosquitto'
@ -104,36 +116,41 @@ Section "Uninstall"
ExecWait '"$INSTDIR\mosquitto.exe" uninstall'
Sleep 1000
Delete "$INSTDIR\mosquitto.dll"
Delete "$INSTDIR\mosquitto.exe"
Delete "$INSTDIR\mosquitto_ctrl.exe"
Delete "$INSTDIR\mosquitto_passwd.exe"
Delete "$INSTDIR\mosquitto_pub.exe"
Delete "$INSTDIR\mosquitto_sub.exe"
Delete "$INSTDIR\mosquitto_rr.exe"
Delete "$INSTDIR\mosquitto.dll"
Delete "$INSTDIR\mosquitto_sub.exe"
Delete "$INSTDIR\mosquittopp.dll"
Delete "$INSTDIR\mosquitto_dynamic_security.dll"
Delete "$INSTDIR\aclfile.example"
Delete "$INSTDIR\ChangeLog.txt"
Delete "$INSTDIR\mosquitto.conf"
Delete "$INSTDIR\pwfile.example"
Delete "$INSTDIR\NOTICE.md"
Delete "$INSTDIR\README.md"
Delete "$INSTDIR\README-windows.txt"
Delete "$INSTDIR\README-letsencrypt.md"
;Delete "$INSTDIR\pthreadVC2.dll"
Delete "$INSTDIR\libssl-1_1.dll"
Delete "$INSTDIR\libcrypto-1_1.dll"
Delete "$INSTDIR\SECURITY.md"
Delete "$INSTDIR\edl-v10"
Delete "$INSTDIR\epl-v20"
Delete "$INSTDIR\mosquitto.ico"
Delete "$INSTDIR\cjson.dll"
Delete "$INSTDIR\libcrypto-3.dll"
Delete "$INSTDIR\libssl-3.dll"
Delete "$INSTDIR\pthreadVC3.dll"
Delete "$INSTDIR\uv.dll"
Delete "$INSTDIR\websockets.dll"
Delete "$INSTDIR\devel\mosquitto.h"
Delete "$INSTDIR\devel\mosquitto.lib"
Delete "$INSTDIR\devel\mosquitto_broker.h"
Delete "$INSTDIR\devel\mosquitto_plugin.h"
Delete "$INSTDIR\devel\mosquittopp.h"
Delete "$INSTDIR\devel\mosquittopp.lib"
Delete "$INSTDIR\devel\mqtt_protocol.h"
RMDir "$INSTDIR\devel\mosquitto"
RMDir "$INSTDIR\devel"
Delete "$INSTDIR\Uninstall.exe"
@ -151,4 +168,3 @@ LangString DESC_SecService ${LANG_ENGLISH} "Install mosquitto as a Windows servi
!insertmacro MUI_DESCRIPTION_TEXT ${SecInstall} $(DESC_SecInstall)
!insertmacro MUI_DESCRIPTION_TEXT ${SecService} $(DESC_SecService)
!insertmacro MUI_FUNCTION_DESCRIPTION_END

View File

@ -9,7 +9,7 @@
!define env_hklm 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
Name "Eclipse Mosquitto"
!define VERSION 2.0.20
!define VERSION 2.0.21
OutFile "mosquitto-${VERSION}-install-windows-x64.exe"
!include "x64.nsh"

View File

@ -89,19 +89,19 @@ set_target_properties(libmosquitto PROPERTIES
POSITION_INDEPENDENT_CODE 1
)
target_link_libraries(libmosquitto PRIVATE ${LIBRARIES})
if (WITH_THREADING)
if(WIN32)
target_link_libraries(libmosquitto PRIVATE PThreads4W::PThreads4W)
set (LIBRARIES ${LIBRARIES} PThreads4W::PThreads4W)
else()
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
target_link_libraries(libmosquitto PRIVATE Threads::Threads)
set (LIBRARIES ${LIBRARIES} Threads::Threads)
endif()
endif()
target_link_libraries(libmosquitto PRIVATE ${LIBRARIES})
set_target_properties(libmosquitto PROPERTIES
OUTPUT_NAME mosquitto
VERSION ${VERSION}

View File

@ -155,10 +155,10 @@ int mosquitto_publish_v5(struct mosquitto *mosq, int *mid, const char *topic, in
message->dup = false;
message->properties = properties_copy;
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
message->state = mosq_ms_invalid;
rc = message__queue(mosq, message, mosq_md_out);
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
return rc;
}
}

View File

@ -24,99 +24,99 @@ Contributors:
void mosquitto_connect_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_connect = on_connect;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_connect_with_flags_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int, int))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_connect_with_flags = on_connect;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_connect_v5_callback_set(struct mosquitto *mosq, void (*on_connect)(struct mosquitto *, void *, int, int, const mosquitto_property *))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_connect_v5 = on_connect;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_disconnect_callback_set(struct mosquitto *mosq, void (*on_disconnect)(struct mosquitto *, void *, int))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_disconnect = on_disconnect;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_disconnect_v5_callback_set(struct mosquitto *mosq, void (*on_disconnect)(struct mosquitto *, void *, int, const mosquitto_property *))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_disconnect_v5 = on_disconnect;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_publish_callback_set(struct mosquitto *mosq, void (*on_publish)(struct mosquitto *, void *, int))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_publish = on_publish;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_publish_v5_callback_set(struct mosquitto *mosq, void (*on_publish)(struct mosquitto *, void *, int, int, const mosquitto_property *props))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_publish_v5 = on_publish;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_message_callback_set(struct mosquitto *mosq, void (*on_message)(struct mosquitto *, void *, const struct mosquitto_message *))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_message = on_message;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_message_v5_callback_set(struct mosquitto *mosq, void (*on_message)(struct mosquitto *, void *, const struct mosquitto_message *, const mosquitto_property *props))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_message_v5 = on_message;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_subscribe_callback_set(struct mosquitto *mosq, void (*on_subscribe)(struct mosquitto *, void *, int, int, const int *))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_subscribe = on_subscribe;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_subscribe_v5_callback_set(struct mosquitto *mosq, void (*on_subscribe)(struct mosquitto *, void *, int, int, const int *, const mosquitto_property *props))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_subscribe_v5 = on_subscribe;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_unsubscribe_callback_set(struct mosquitto *mosq, void (*on_unsubscribe)(struct mosquitto *, void *, int))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_unsubscribe = on_unsubscribe;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_unsubscribe_v5_callback_set(struct mosquitto *mosq, void (*on_unsubscribe)(struct mosquitto *, void *, int, const mosquitto_property *props))
{
pthread_mutex_lock(&mosq->callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
mosq->on_unsubscribe_v5 = on_unsubscribe;
pthread_mutex_unlock(&mosq->callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
}
void mosquitto_log_callback_set(struct mosquitto *mosq, void (*on_log)(struct mosquitto *, void *, int, const char *))
{
pthread_mutex_lock(&mosq->log_callback_mutex);
COMPAT_pthread_mutex_lock(&mosq->log_callback_mutex);
mosq->on_log = on_log;
pthread_mutex_unlock(&mosq->log_callback_mutex);
COMPAT_pthread_mutex_unlock(&mosq->log_callback_mutex);
}

View File

@ -179,10 +179,10 @@ static int mosquitto__reconnect(struct mosquitto *mosq, bool blocking)
if(rc) return rc;
}
pthread_mutex_lock(&mosq->msgtime_mutex);
COMPAT_pthread_mutex_lock(&mosq->msgtime_mutex);
mosq->last_msg_in = mosquitto_time();
mosq->next_msg_out = mosq->last_msg_in + mosq->keepalive;
pthread_mutex_unlock(&mosq->msgtime_mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgtime_mutex);
mosq->ping_t = 0;
@ -267,11 +267,14 @@ int mosquitto_disconnect_v5(struct mosquitto *mosq, int reason_code, const mosqu
void do_client_disconnect(struct mosquitto *mosq, int reason_code, const mosquitto_property *properties)
{
void (*on_disconnect)(struct mosquitto *, void *userdata, int rc);
void (*on_disconnect_v5)(struct mosquitto *, void *userdata, int rc, const mosquitto_property *props);
mosquitto__set_state(mosq, mosq_cs_disconnected);
net__socket_close(mosq);
/* Free data and reset values */
pthread_mutex_lock(&mosq->out_packet_mutex);
COMPAT_pthread_mutex_lock(&mosq->out_packet_mutex);
mosq->current_out_packet = mosq->out_packet;
if(mosq->out_packet){
mosq->out_packet = mosq->out_packet->next;
@ -280,24 +283,27 @@ void do_client_disconnect(struct mosquitto *mosq, int reason_code, const mosquit
}
mosq->out_packet_count--;
}
pthread_mutex_unlock(&mosq->out_packet_mutex);
COMPAT_pthread_mutex_unlock(&mosq->out_packet_mutex);
pthread_mutex_lock(&mosq->msgtime_mutex);
COMPAT_pthread_mutex_lock(&mosq->msgtime_mutex);
mosq->next_msg_out = mosquitto_time() + mosq->keepalive;
pthread_mutex_unlock(&mosq->msgtime_mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgtime_mutex);
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_disconnect){
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_disconnect = mosq->on_disconnect;
on_disconnect_v5 = mosq->on_disconnect_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_disconnect){
mosq->in_callback = true;
mosq->on_disconnect(mosq, mosq->userdata, reason_code);
on_disconnect(mosq, mosq->userdata, reason_code);
mosq->in_callback = false;
}
if(mosq->on_disconnect_v5){
if(on_disconnect_v5){
mosq->in_callback = true;
mosq->on_disconnect_v5(mosq, mosq->userdata, reason_code, properties);
on_disconnect_v5(mosq, mosq->userdata, reason_code, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
pthread_mutex_unlock(&mosq->current_out_packet_mutex);
COMPAT_pthread_mutex_unlock(&mosq->current_out_packet_mutex);
}

View File

@ -32,27 +32,35 @@ Contributors:
static void connack_callback(struct mosquitto *mosq, uint8_t reason_code, uint8_t connect_flags, const mosquitto_property *properties)
{
void (*on_connect)(struct mosquitto *, void *userdata, int rc);
void (*on_connect_with_flags)(struct mosquitto *, void *userdata, int rc, int flags);
void (*on_connect_v5)(struct mosquitto *, void *userdata, int rc, int flags, const mosquitto_property *props);
log__printf(mosq, MOSQ_LOG_DEBUG, "Client %s received CONNACK (%d)", SAFE_PRINT(mosq->id), reason_code);
if(reason_code == MQTT_RC_SUCCESS){
mosq->reconnects = 0;
}
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_connect){
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_connect = mosq->on_connect;
on_connect_with_flags = mosq->on_connect_with_flags;
on_connect_v5 = mosq->on_connect_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_connect){
mosq->in_callback = true;
mosq->on_connect(mosq, mosq->userdata, reason_code);
on_connect(mosq, mosq->userdata, reason_code);
mosq->in_callback = false;
}
if(mosq->on_connect_with_flags){
if(on_connect_with_flags){
mosq->in_callback = true;
mosq->on_connect_with_flags(mosq, mosq->userdata, reason_code, connect_flags);
on_connect_with_flags(mosq, mosq->userdata, reason_code, connect_flags);
mosq->in_callback = false;
}
if(mosq->on_connect_v5){
if(on_connect_v5){
mosq->in_callback = true;
mosq->on_connect_v5(mosq, mosq->userdata, reason_code, connect_flags, properties);
on_connect_v5(mosq, mosq->userdata, reason_code, connect_flags, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
}
@ -117,11 +125,11 @@ int handle__connack(struct mosquitto *mosq)
switch(reason_code){
case 0:
pthread_mutex_lock(&mosq->state_mutex);
COMPAT_pthread_mutex_lock(&mosq->state_mutex);
if(mosq->state != mosq_cs_disconnecting){
mosq->state = mosq_cs_active;
}
pthread_mutex_unlock(&mosq->state_mutex);
COMPAT_pthread_mutex_unlock(&mosq->state_mutex);
message__retry_check(mosq);
return MOSQ_ERR_SUCCESS;
case 1:

View File

@ -136,26 +136,32 @@ int handle__pubackcomp(struct mosquitto *mosq, const char *type)
rc = message__delete(mosq, mid, mosq_md_out, qos);
if(rc == MOSQ_ERR_SUCCESS){
void (*on_publish)(struct mosquitto *, void *userdata, int mid);
void (*on_publish_v5)(struct mosquitto *, void *userdata, int mid, int reason_code, const mosquitto_property *props);
/* Only inform the client the message has been sent once. */
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_publish){
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_publish = mosq->on_publish;
on_publish_v5 = mosq->on_publish_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_publish){
mosq->in_callback = true;
mosq->on_publish(mosq, mosq->userdata, mid);
on_publish(mosq, mosq->userdata, mid);
mosq->in_callback = false;
}
if(mosq->on_publish_v5){
if(on_publish_v5){
mosq->in_callback = true;
mosq->on_publish_v5(mosq, mosq->userdata, mid, reason_code, properties);
on_publish_v5(mosq, mosq->userdata, mid, reason_code, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
mosquitto_property_free_all(&properties);
}else if(rc != MOSQ_ERR_NOT_FOUND){
return rc;
}
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
message__release_to_inflight(mosq, mosq_md_out);
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
return MOSQ_ERR_SUCCESS;
#endif

View File

@ -120,38 +120,44 @@ int handle__publish(struct mosquitto *mosq)
(long)message->msg.payloadlen);
message->timestamp = mosquitto_time();
void (*on_message)(struct mosquitto *, void *userdata, const struct mosquitto_message *message);
void (*on_message_v5)(struct mosquitto *, void *userdata, const struct mosquitto_message *message, const mosquitto_property *props);
switch(message->msg.qos){
case 0:
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_message){
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_message = mosq->on_message;
on_message_v5 = mosq->on_message_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_message){
mosq->in_callback = true;
mosq->on_message(mosq, mosq->userdata, &message->msg);
on_message(mosq, mosq->userdata, &message->msg);
mosq->in_callback = false;
}
if(mosq->on_message_v5){
mosq->in_callback = true;
mosq->on_message_v5(mosq, mosq->userdata, &message->msg, properties);
on_message_v5(mosq, mosq->userdata, &message->msg, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
message__cleanup(&message);
mosquitto_property_free_all(&properties);
return MOSQ_ERR_SUCCESS;
case 1:
util__decrement_receive_quota(mosq);
rc = send__puback(mosq, mid, 0, NULL);
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_message){
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_message = mosq->on_message;
on_message_v5 = mosq->on_message_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_message){
mosq->in_callback = true;
mosq->on_message(mosq, mosq->userdata, &message->msg);
on_message(mosq, mosq->userdata, &message->msg);
mosq->in_callback = false;
}
if(mosq->on_message_v5){
if(on_message_v5){
mosq->in_callback = true;
mosq->on_message_v5(mosq, mosq->userdata, &message->msg, properties);
on_message_v5(mosq, mosq->userdata, &message->msg, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
message__cleanup(&message);
mosquitto_property_free_all(&properties);
return rc;
@ -159,10 +165,10 @@ int handle__publish(struct mosquitto *mosq)
message->properties = properties;
util__decrement_receive_quota(mosq);
rc = send__pubrec(mosq, mid, 0, NULL);
pthread_mutex_lock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_in.mutex);
message->state = mosq_ms_wait_for_pubrel;
message__queue(mosq, message, mosq_md_in);
pthread_mutex_unlock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_in.mutex);
return rc;
default:
message__cleanup(&message);

View File

@ -107,18 +107,21 @@ int handle__pubrec(struct mosquitto *mosq)
}else{
if(!message__delete(mosq, mid, mosq_md_out, 2)){
/* Only inform the client the message has been sent once. */
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_publish_v5){
void (*on_publish_v5)(struct mosquitto *, void *userdata, int mid, int reason_code, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_publish_v5 = mosq->on_publish_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_publish_v5){
mosq->in_callback = true;
mosq->on_publish_v5(mosq, mosq->userdata, mid, reason_code, properties);
on_publish_v5(mosq, mosq->userdata, mid, reason_code, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
}
util__increment_send_quota(mosq);
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
message__release_to_inflight(mosq, mosq_md_out);
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
return MOSQ_ERR_SUCCESS;
}
#endif

View File

@ -116,18 +116,22 @@ int handle__pubrel(struct mosquitto *mosq)
if(rc == MOSQ_ERR_SUCCESS){
/* Only pass the message on if we have removed it from the queue - this
* prevents multiple callbacks for the same message. */
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_message){
void (*on_message)(struct mosquitto *, void *userdata, const struct mosquitto_message *message);
void (*on_message_v5)(struct mosquitto *, void *userdata, const struct mosquitto_message *message, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_message = mosq->on_message;
on_message_v5 = mosq->on_message_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_message){
mosq->in_callback = true;
mosq->on_message(mosq, mosq->userdata, &message->msg);
on_message(mosq, mosq->userdata, &message->msg);
mosq->in_callback = false;
}
if(mosq->on_message_v5){
if(on_message_v5){
mosq->in_callback = true;
mosq->on_message_v5(mosq, mosq->userdata, &message->msg, message->properties);
on_message_v5(mosq, mosq->userdata, &message->msg, message->properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
mosquitto_property_free_all(&properties);
message__cleanup(&message);
}else if(rc == MOSQ_ERR_NOT_FOUND){

View File

@ -97,18 +97,22 @@ int handle__suback(struct mosquitto *mosq)
/* Immediately free, we don't do anything with Reason String or User Property at the moment */
mosquitto_property_free_all(&properties);
#else
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_subscribe){
void (*on_subscribe)(struct mosquitto *, void *userdata, int mid, int qos_count, const int *granted_qos);
void (*on_subscribe_v5)(struct mosquitto *, void *userdata, int mid, int qos_count, const int *granted_qos, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_subscribe = mosq->on_subscribe;
on_subscribe_v5 = mosq->on_subscribe_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_subscribe){
mosq->in_callback = true;
mosq->on_subscribe(mosq, mosq->userdata, mid, qos_count, granted_qos);
on_subscribe(mosq, mosq->userdata, mid, qos_count, granted_qos);
mosq->in_callback = false;
}
if(mosq->on_subscribe_v5){
if(on_subscribe_v5){
mosq->in_callback = true;
mosq->on_subscribe_v5(mosq, mosq->userdata, mid, qos_count, granted_qos, properties);
on_subscribe_v5(mosq, mosq->userdata, mid, qos_count, granted_qos, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
mosquitto_property_free_all(&properties);
#endif
mosquitto__free(granted_qos);

View File

@ -76,18 +76,22 @@ int handle__unsuback(struct mosquitto *mosq)
/* Immediately free, we don't do anything with Reason String or User Property at the moment */
mosquitto_property_free_all(&properties);
#else
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_unsubscribe){
void (*on_unsubscribe)(struct mosquitto *, void *userdata, int mid);
void (*on_unsubscribe_v5)(struct mosquitto *, void *userdata, int mid, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_unsubscribe = mosq->on_unsubscribe;
on_unsubscribe_v5 = mosq->on_unsubscribe_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_unsubscribe){
mosq->in_callback = true;
mosq->on_unsubscribe(mosq, mosq->userdata, mid);
on_unsubscribe(mosq, mosq->userdata, mid);
mosq->in_callback = false;
}
if(mosq->on_unsubscribe_v5){
if(on_unsubscribe_v5){
mosq->in_callback = true;
mosq->on_unsubscribe_v5(mosq, mosq->userdata, mid, properties);
on_unsubscribe_v5(mosq, mosq->userdata, mid, properties);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
mosquitto_property_free_all(&properties);
#endif

View File

@ -33,16 +33,19 @@ int log__printf(struct mosquitto *mosq, unsigned int priority, const char *fmt,
va_list va;
char *s;
size_t len;
void (*on_log)(struct mosquitto *, void *userdata, int level, const char *str);
assert(mosq);
assert(fmt);
pthread_mutex_lock(&mosq->log_callback_mutex);
if(mosq->on_log){
COMPAT_pthread_mutex_lock(&mosq->log_callback_mutex);
on_log = mosq->on_log;
COMPAT_pthread_mutex_unlock(&mosq->log_callback_mutex);
if(on_log){
len = strlen(fmt) + 500;
s = mosquitto__malloc(len*sizeof(char));
if(!s){
pthread_mutex_unlock(&mosq->log_callback_mutex);
return MOSQ_ERR_NOMEM;
}
@ -51,11 +54,10 @@ int log__printf(struct mosquitto *mosq, unsigned int priority, const char *fmt,
va_end(va);
s[len-1] = '\0'; /* Ensure string is null terminated. */
mosq->on_log(mosq, mosq->userdata, (int)priority, s);
on_log(mosq, mosq->userdata, (int)priority, s);
mosquitto__free(s);
}
pthread_mutex_unlock(&mosq->log_callback_mutex);
return MOSQ_ERR_SUCCESS;
}

View File

@ -70,13 +70,13 @@ int mosquitto_loop(struct mosquitto *mosq, int timeout, int max_packets)
if(mosq->ssl == NULL || SSL_is_init_finished(mosq->ssl))
#endif
{
pthread_mutex_lock(&mosq->current_out_packet_mutex);
pthread_mutex_lock(&mosq->out_packet_mutex);
COMPAT_pthread_mutex_lock(&mosq->current_out_packet_mutex);
COMPAT_pthread_mutex_lock(&mosq->out_packet_mutex);
if(mosq->out_packet || mosq->current_out_packet){
FD_SET(mosq->sock, &writefds);
}
pthread_mutex_unlock(&mosq->out_packet_mutex);
pthread_mutex_unlock(&mosq->current_out_packet_mutex);
COMPAT_pthread_mutex_unlock(&mosq->out_packet_mutex);
COMPAT_pthread_mutex_unlock(&mosq->current_out_packet_mutex);
}
}
}else{
@ -110,11 +110,11 @@ int mosquitto_loop(struct mosquitto *mosq, int timeout, int max_packets)
}
now = mosquitto_time();
pthread_mutex_lock(&mosq->msgtime_mutex);
COMPAT_pthread_mutex_lock(&mosq->msgtime_mutex);
if(mosq->next_msg_out && now + timeout_ms/1000 > mosq->next_msg_out){
timeout_ms = (mosq->next_msg_out - now)*1000;
}
pthread_mutex_unlock(&mosq->msgtime_mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgtime_mutex);
if(timeout_ms < 0){
/* There has been a delay somewhere which means we should have already
@ -252,7 +252,7 @@ int mosquitto_loop_forever(struct mosquitto *mosq, int timeout, int max_packets)
while(run){
do{
#ifdef HAVE_PTHREAD_CANCEL
pthread_testcancel();
COMPAT_pthread_testcancel();
#endif
rc = mosquitto_loop(mosq, timeout, max_packets);
}while(run && rc == MOSQ_ERR_SUCCESS);
@ -279,7 +279,7 @@ int mosquitto_loop_forever(struct mosquitto *mosq, int timeout, int max_packets)
}
do{
#ifdef HAVE_PTHREAD_CANCEL
pthread_testcancel();
COMPAT_pthread_testcancel();
#endif
rc = MOSQ_ERR_SUCCESS;
if(mosquitto__get_request_disconnect(mosq)){
@ -335,18 +335,23 @@ static int mosquitto__loop_rc_handle(struct mosquitto *mosq, int rc)
if(state == mosq_cs_disconnecting || state == mosq_cs_disconnected){
rc = MOSQ_ERR_SUCCESS;
}
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_disconnect){
void (*on_disconnect)(struct mosquitto *, void *userdata, int rc);
void (*on_disconnect_v5)(struct mosquitto *, void *userdata, int rc, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_disconnect = mosq->on_disconnect;
on_disconnect_v5 = mosq->on_disconnect_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_disconnect){
mosq->in_callback = true;
mosq->on_disconnect(mosq, mosq->userdata, rc);
on_disconnect(mosq, mosq->userdata, rc);
mosq->in_callback = false;
}
if(mosq->on_disconnect_v5){
if(on_disconnect_v5){
mosq->in_callback = true;
mosq->on_disconnect_v5(mosq, mosq->userdata, rc, NULL);
on_disconnect_v5(mosq, mosq->userdata, rc, NULL);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
}
return rc;
}
@ -358,13 +363,13 @@ int mosquitto_loop_read(struct mosquitto *mosq, int max_packets)
int i;
if(max_packets < 1) return MOSQ_ERR_INVAL;
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
max_packets = mosq->msgs_out.queue_len;
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
pthread_mutex_lock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_in.mutex);
max_packets += mosq->msgs_in.queue_len;
pthread_mutex_unlock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_in.mutex);
if(max_packets < 1) max_packets = 1;
/* Queue len here tells us how many messages are awaiting processing and

View File

@ -142,7 +142,7 @@ void message__reconnect_reset(struct mosquitto *mosq, bool update_quota_only)
struct mosquitto_message_all *message, *tmp;
assert(mosq);
pthread_mutex_lock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_in.mutex);
mosq->msgs_in.inflight_quota = mosq->msgs_in.inflight_maximum;
mosq->msgs_in.queue_len = 0;
DL_FOREACH_SAFE(mosq->msgs_in.inflight, message, tmp){
@ -157,10 +157,10 @@ void message__reconnect_reset(struct mosquitto *mosq, bool update_quota_only)
util__decrement_receive_quota(mosq);
}
}
pthread_mutex_unlock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_in.mutex);
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
mosq->msgs_out.inflight_quota = mosq->msgs_out.inflight_maximum;
mosq->msgs_out.queue_len = 0;
DL_FOREACH_SAFE(mosq->msgs_out.inflight, message, tmp){
@ -185,7 +185,7 @@ void message__reconnect_reset(struct mosquitto *mosq, bool update_quota_only)
message->state = mosq_ms_invalid;
}
}
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
}
@ -228,12 +228,12 @@ int message__remove(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_dir
assert(message);
if(dir == mosq_md_out){
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
DL_FOREACH_SAFE(mosq->msgs_out.inflight, cur, tmp){
if(found == false && cur->msg.mid == mid){
if(cur->msg.qos != qos){
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
return MOSQ_ERR_PROTOCOL;
}
DL_DELETE(mosq->msgs_out.inflight, cur);
@ -244,18 +244,18 @@ int message__remove(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_dir
break;
}
}
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
if(found){
return MOSQ_ERR_SUCCESS;
}else{
return MOSQ_ERR_NOT_FOUND;
}
}else{
pthread_mutex_lock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_in.mutex);
DL_FOREACH_SAFE(mosq->msgs_in.inflight, cur, tmp){
if(cur->msg.mid == mid){
if(cur->msg.qos != qos){
pthread_mutex_unlock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_in.mutex);
return MOSQ_ERR_PROTOCOL;
}
DL_DELETE(mosq->msgs_in.inflight, cur);
@ -266,7 +266,7 @@ int message__remove(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg_dir
}
}
pthread_mutex_unlock(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_in.mutex);
if(found){
return MOSQ_ERR_SUCCESS;
}else{
@ -282,7 +282,7 @@ void message__retry_check(struct mosquitto *mosq)
assert(mosq);
#ifdef WITH_THREADING
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
#endif
DL_FOREACH(mosq->msgs_out.inflight, msg){
@ -309,7 +309,7 @@ void message__retry_check(struct mosquitto *mosq)
}
}
#ifdef WITH_THREADING
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
#endif
}
@ -325,20 +325,20 @@ int message__out_update(struct mosquitto *mosq, uint16_t mid, enum mosquitto_msg
struct mosquitto_message_all *message, *tmp;
assert(mosq);
pthread_mutex_lock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_lock(&mosq->msgs_out.mutex);
DL_FOREACH_SAFE(mosq->msgs_out.inflight, message, tmp){
if(message->msg.mid == mid){
if(message->msg.qos != qos){
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
return MOSQ_ERR_PROTOCOL;
}
message->state = state;
message->timestamp = mosquitto_time();
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
return MOSQ_ERR_SUCCESS;
}
}
pthread_mutex_unlock(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_unlock(&mosq->msgs_out.mutex);
return MOSQ_ERR_NOT_FOUND;
}

View File

@ -203,24 +203,27 @@ int mosquitto_reinitialise(struct mosquitto *mosq, const char *id, bool clean_st
mosq->ssl = NULL;
mosq->ssl_ctx = NULL;
mosq->ssl_ctx_defaults = true;
#ifndef WITH_BROKER
mosq->user_ssl_ctx = NULL;
#endif
mosq->tls_cert_reqs = SSL_VERIFY_PEER;
mosq->tls_insecure = false;
mosq->want_write = false;
mosq->tls_ocsp_required = false;
#endif
#ifdef WITH_THREADING
pthread_mutex_init(&mosq->callback_mutex, NULL);
pthread_mutex_init(&mosq->log_callback_mutex, NULL);
pthread_mutex_init(&mosq->state_mutex, NULL);
pthread_mutex_init(&mosq->out_packet_mutex, NULL);
pthread_mutex_init(&mosq->current_out_packet_mutex, NULL);
pthread_mutex_init(&mosq->msgtime_mutex, NULL);
pthread_mutex_init(&mosq->msgs_in.mutex, NULL);
pthread_mutex_init(&mosq->msgs_out.mutex, NULL);
pthread_mutex_init(&mosq->mid_mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->callback_mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->log_callback_mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->state_mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->out_packet_mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->current_out_packet_mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->msgtime_mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->msgs_in.mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->msgs_out.mutex, NULL);
COMPAT_pthread_mutex_init(&mosq->mid_mutex, NULL);
mosq->thread_id = pthread_self();
#endif
/* This must be after pthread_mutex_init(), otherwise the log mutex may be
/* This must be after COMPAT_pthread_mutex_init(), otherwise the log mutex may be
* used before being initialised. */
if(net__socketpair(&mosq->sockpairR, &mosq->sockpairW)){
log__printf(mosq, MOSQ_LOG_WARNING,
@ -238,8 +241,8 @@ void mosquitto__destroy(struct mosquitto *mosq)
#ifdef WITH_THREADING
# ifdef HAVE_PTHREAD_CANCEL
if(mosq->threaded == mosq_ts_self && !pthread_equal(mosq->thread_id, pthread_self())){
pthread_cancel(mosq->thread_id);
pthread_join(mosq->thread_id, NULL);
COMPAT_pthread_cancel(mosq->thread_id);
COMPAT_pthread_join(mosq->thread_id, NULL);
mosq->threaded = mosq_ts_none;
}
# endif
@ -248,15 +251,15 @@ void mosquitto__destroy(struct mosquitto *mosq)
/* If mosq->id is not NULL then the client has already been initialised
* and so the mutexes need destroying. If mosq->id is NULL, the mutexes
* haven't been initialised. */
pthread_mutex_destroy(&mosq->callback_mutex);
pthread_mutex_destroy(&mosq->log_callback_mutex);
pthread_mutex_destroy(&mosq->state_mutex);
pthread_mutex_destroy(&mosq->out_packet_mutex);
pthread_mutex_destroy(&mosq->current_out_packet_mutex);
pthread_mutex_destroy(&mosq->msgtime_mutex);
pthread_mutex_destroy(&mosq->msgs_in.mutex);
pthread_mutex_destroy(&mosq->msgs_out.mutex);
pthread_mutex_destroy(&mosq->mid_mutex);
COMPAT_pthread_mutex_destroy(&mosq->callback_mutex);
COMPAT_pthread_mutex_destroy(&mosq->log_callback_mutex);
COMPAT_pthread_mutex_destroy(&mosq->state_mutex);
COMPAT_pthread_mutex_destroy(&mosq->out_packet_mutex);
COMPAT_pthread_mutex_destroy(&mosq->current_out_packet_mutex);
COMPAT_pthread_mutex_destroy(&mosq->msgtime_mutex);
COMPAT_pthread_mutex_destroy(&mosq->msgs_in.mutex);
COMPAT_pthread_mutex_destroy(&mosq->msgs_out.mutex);
COMPAT_pthread_mutex_destroy(&mosq->mid_mutex);
}
#endif
if(mosq->sock != INVALID_SOCKET){
@ -268,9 +271,17 @@ void mosquitto__destroy(struct mosquitto *mosq)
if(mosq->ssl){
SSL_free(mosq->ssl);
}
if(mosq->ssl_ctx){
SSL_CTX_free(mosq->ssl_ctx);
}
#ifndef WITH_BROKER
if(mosq->user_ssl_ctx){
SSL_CTX_free(mosq->user_ssl_ctx);
}else if(mosq->ssl_ctx){
SSL_CTX_free(mosq->ssl_ctx);
}
#else
if(mosq->ssl_ctx){
SSL_CTX_free(mosq->ssl_ctx);
}
#endif
mosquitto__free(mosq->tls_cafile);
mosquitto__free(mosq->tls_capath);
mosquitto__free(mosq->tls_certfile);
@ -281,6 +292,10 @@ void mosquitto__destroy(struct mosquitto *mosq)
mosquitto__free(mosq->tls_psk);
mosquitto__free(mosq->tls_psk_identity);
mosquitto__free(mosq->tls_alpn);
#ifndef OPENSSL_NO_ENGINE
mosquitto__free(mosq->tls_engine);
mosq->tls_engine = NULL;
#endif
#endif
mosquitto__free(mosq->address);

View File

@ -353,6 +353,10 @@ struct mosquitto {
struct mosquitto *for_free_next;
struct session_expiry_list *expiry_list_item;
uint16_t remote_port;
# ifndef WITH_OLD_KEEPALIVE
struct mosquitto *keepalive_next;
struct mosquitto *keepalive_prev;
# endif
#endif
uint32_t events;
};

View File

@ -198,6 +198,15 @@ void net__init_tls(void)
}
#endif
bool net__is_connected(struct mosquitto *mosq)
{
#if defined(WITH_BROKER) && defined(WITH_WEBSOCKETS)
return mosq->sock != INVALID_SOCKET || mosq->wsi != NULL;
#else
return mosq->sock != INVALID_SOCKET;
#endif
}
/* Close a socket associated with a context and set it to -1.
* Returns 1 on failure (context is NULL)
* Returns 0 on success.

View File

@ -75,6 +75,7 @@ int net__try_connect_step2(struct mosquitto *mosq, uint16_t port, mosq_sock_t *s
int net__socket_connect_step3(struct mosquitto *mosq, const char *host);
int net__socket_nonblock(mosq_sock_t *sock);
int net__socketpair(mosq_sock_t *sp1, mosq_sock_t *sp2);
bool net__is_connected(struct mosquitto *mosq);
ssize_t net__read(struct mosquitto *mosq, void *buf, size_t count);
ssize_t net__write(struct mosquitto *mosq, const void *buf, size_t count);

View File

@ -296,20 +296,24 @@ int packet__write(struct mosquitto *mosq)
if(((packet->command)&0xF6) == CMD_PUBLISH){
G_PUB_MSGS_SENT_INC(1);
#ifndef WITH_BROKER
void (*on_publish)(struct mosquitto *, void *userdata, int mid);
void (*on_publish_v5)(struct mosquitto *, void *userdata, int mid, int reason_code, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_publish){
/* This is a QoS=0 message */
mosq->in_callback = true;
mosq->on_publish(mosq, mosq->userdata, packet->mid);
mosq->in_callback = false;
}
if(mosq->on_publish_v5){
/* This is a QoS=0 message */
mosq->in_callback = true;
mosq->on_publish_v5(mosq, mosq->userdata, packet->mid, 0, NULL);
mosq->in_callback = false;
}
on_publish = mosq->on_publish;
on_publish_v5 = mosq->on_publish_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_publish){
/* This is a QoS=0 message */
mosq->in_callback = true;
on_publish(mosq, mosq->userdata, packet->mid);
mosq->in_callback = false;
}
if(on_publish_v5){
/* This is a QoS=0 message */
mosq->in_callback = true;
on_publish_v5(mosq, mosq->userdata, packet->mid, 0, NULL);
mosq->in_callback = false;
}
}else if(((packet->command)&0xF0) == CMD_DISCONNECT){
do_client_disconnect(mosq, MOSQ_ERR_SUCCESS, NULL);
packet__cleanup(packet);
@ -395,6 +399,11 @@ int packet__read(struct mosquitto *mosq)
/* Clients must send CONNECT as their first command. */
if(!(mosq->bridge) && state == mosq_cs_new && (byte&0xF0) != CMD_CONNECT){
return MOSQ_ERR_PROTOCOL;
}else if((byte&0xF0) == CMD_RESERVED){
if(mosq->protocol == mosq_p_mqtt5){
send__disconnect(mosq, MQTT_RC_PROTOCOL_ERROR, NULL);
}
return MOSQ_ERR_PROTOCOL;
}
#endif
}else{

View File

@ -241,7 +241,7 @@ void property__free(mosquitto_property **property)
break;
}
free(*property);
mosquitto__free(*property);
*property = NULL;
}
@ -1120,7 +1120,7 @@ const mosquitto_property *mosquitto_property_read_binary(const mosquitto_propert
if(value){
*len = p->value.bin.len;
*value = calloc(1, *len + 1U);
*value = mosquitto__calloc(1, *len + 1U);
if(!(*value)) return NULL;
memcpy(*value, p->value.bin.v, *len);
@ -1149,7 +1149,7 @@ const mosquitto_property *mosquitto_property_read_string(const mosquitto_propert
}
if(value){
*value = calloc(1, (size_t)p->value.s.len+1);
*value = mosquitto__calloc(1, (size_t)p->value.s.len+1);
if(!(*value)) return NULL;
memcpy(*value, p->value.s.v, p->value.s.len);
@ -1172,16 +1172,16 @@ const mosquitto_property *mosquitto_property_read_string_pair(const mosquitto_pr
if(p->identifier != MQTT_PROP_USER_PROPERTY) return NULL;
if(name){
*name = calloc(1, (size_t)p->name.len+1);
*name = mosquitto__calloc(1, (size_t)p->name.len+1);
if(!(*name)) return NULL;
memcpy(*name, p->name.v, p->name.len);
}
if(value){
*value = calloc(1, (size_t)p->value.s.len+1);
*value = mosquitto__calloc(1, (size_t)p->value.s.len+1);
if(!(*value)){
if(name){
free(*name);
mosquitto__free(*name);
*name = NULL;
}
return NULL;
@ -1203,7 +1203,7 @@ int mosquitto_property_copy_all(mosquitto_property **dest, const mosquitto_prope
*dest = NULL;
while(src){
pnew = calloc(1, sizeof(mosquitto_property));
pnew = mosquitto__calloc(1, sizeof(mosquitto_property));
if(!pnew){
mosquitto_property_free_all(dest);
return MOSQ_ERR_NOMEM;
@ -1255,7 +1255,7 @@ int mosquitto_property_copy_all(mosquitto_property **dest, const mosquitto_prope
case MQTT_PROP_SERVER_REFERENCE:
case MQTT_PROP_REASON_STRING:
pnew->value.s.len = src->value.s.len;
pnew->value.s.v = src->value.s.v ? strdup(src->value.s.v) : (char*)calloc(1,1);
pnew->value.s.v = src->value.s.v ? mosquitto__strdup(src->value.s.v) : (char*)mosquitto__calloc(1,1);
if(!pnew->value.s.v){
mosquitto_property_free_all(dest);
return MOSQ_ERR_NOMEM;
@ -1265,7 +1265,7 @@ int mosquitto_property_copy_all(mosquitto_property **dest, const mosquitto_prope
case MQTT_PROP_AUTHENTICATION_DATA:
case MQTT_PROP_CORRELATION_DATA:
pnew->value.bin.len = src->value.bin.len;
pnew->value.bin.v = malloc(pnew->value.bin.len);
pnew->value.bin.v = mosquitto__malloc(pnew->value.bin.len);
if(!pnew->value.bin.v){
mosquitto_property_free_all(dest);
return MOSQ_ERR_NOMEM;
@ -1275,14 +1275,14 @@ int mosquitto_property_copy_all(mosquitto_property **dest, const mosquitto_prope
case MQTT_PROP_USER_PROPERTY:
pnew->value.s.len = src->value.s.len;
pnew->value.s.v = src->value.s.v ? strdup(src->value.s.v) : (char*)calloc(1,1);
pnew->value.s.v = src->value.s.v ? mosquitto__strdup(src->value.s.v) : (char*)mosquitto__calloc(1,1);
if(!pnew->value.s.v){
mosquitto_property_free_all(dest);
return MOSQ_ERR_NOMEM;
}
pnew->name.len = src->name.len;
pnew->name.v = src->name.v ? strdup(src->name.v) : (char*)calloc(1,1);
pnew->name.v = src->name.v ? mosquitto__strdup(src->name.v) : (char*)mosquitto__calloc(1,1);
if(!pnew->name.v){
mosquitto_property_free_all(dest);
return MOSQ_ERR_NOMEM;

View File

@ -10,7 +10,7 @@
# define COMPAT_pthread_testcancel() pthread_testcancel()
# define COMPAT_pthread_mutex_init(A, B) pthread_mutex_init((A), (B))
# define COMPAT_pthread_mutex_destroy(A) pthread_mutex_init((A))
# define COMPAT_pthread_mutex_destroy(A) pthread_mutex_destroy((A))
# define COMPAT_pthread_mutex_lock(A) pthread_mutex_lock((A))
# define COMPAT_pthread_mutex_unlock(A) pthread_mutex_unlock((A))
#else

View File

@ -49,18 +49,22 @@ static void srv_callback(void *arg, int status, int timeouts, unsigned char *abu
}else{
log__printf(mosq, MOSQ_LOG_ERR, "Error: SRV lookup failed (%d).", status);
/* FIXME - calling on_disconnect here isn't correct. */
pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_disconnect){
void (*on_disconnect)(struct mosquitto *, void *userdata, int rc);
void (*on_disconnect_v5)(struct mosquitto *, void *userdata, int rc, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
on_disconnect = mosq->on_disconnect;
on_disconnect_v5 = mosq->on_disconnect_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_disconnect){
mosq->in_callback = true;
mosq->on_disconnect(mosq, mosq->userdata, MOSQ_ERR_LOOKUP);
on_disconnect(mosq, mosq->userdata, MOSQ_ERR_LOOKUP);
mosq->in_callback = false;
}
if(mosq->on_disconnect_v5){
if(on_disconnect_v5){
mosq->in_callback = true;
mosq->on_disconnect_v5(mosq, mosq->userdata, MOSQ_ERR_LOOKUP, NULL);
on_disconnect_v5(mosq, mosq->userdata, MOSQ_ERR_LOOKUP, NULL);
mosq->in_callback = false;
}
pthread_mutex_unlock(&mosq->callback_mutex);
}
}
#endif

View File

@ -42,7 +42,7 @@ int mosquitto_loop_start(struct mosquitto *mosq)
if(!mosq || mosq->threaded != mosq_ts_none) return MOSQ_ERR_INVAL;
mosq->threaded = mosq_ts_self;
if(!pthread_create(&mosq->thread_id, NULL, mosquitto__thread_main, mosq)){
if(!COMPAT_pthread_create(&mosq->thread_id, NULL, mosquitto__thread_main, mosq)){
#if defined(__linux__)
pthread_setname_np(mosq->thread_id, "mosquitto loop");
#elif defined(__NetBSD__)
@ -83,10 +83,10 @@ int mosquitto_loop_stop(struct mosquitto *mosq, bool force)
#ifdef HAVE_PTHREAD_CANCEL
if(force){
pthread_cancel(mosq->thread_id);
COMPAT_pthread_cancel(mosq->thread_id);
}
#endif
pthread_join(mosq->thread_id, NULL);
COMPAT_pthread_join(mosq->thread_id, NULL);
mosq->thread_id = pthread_self();
mosq->threaded = mosq_ts_none;

View File

@ -118,18 +118,22 @@ int mosquitto__check_keepalive(struct mosquitto *mosq)
}else{
rc = MOSQ_ERR_KEEPALIVE;
}
void (*on_disconnect)(struct mosquitto *, void *userdata, int rc);
void (*on_disconnect_v5)(struct mosquitto *, void *userdata, int rc, const mosquitto_property *props);
COMPAT_pthread_mutex_lock(&mosq->callback_mutex);
if(mosq->on_disconnect){
mosq->in_callback = true;
mosq->on_disconnect(mosq, mosq->userdata, rc);
mosq->in_callback = false;
}
if(mosq->on_disconnect_v5){
mosq->in_callback = true;
mosq->on_disconnect_v5(mosq, mosq->userdata, rc, NULL);
mosq->in_callback = false;
}
on_disconnect = mosq->on_disconnect;
on_disconnect_v5 = mosq->on_disconnect_v5;
COMPAT_pthread_mutex_unlock(&mosq->callback_mutex);
if(on_disconnect){
mosq->in_callback = true;
on_disconnect(mosq, mosq->userdata, rc);
mosq->in_callback = false;
}
if(on_disconnect_v5){
mosq->in_callback = true;
on_disconnect_v5(mosq, mosq->userdata, rc, NULL);
mosq->in_callback = false;
}
return rc;
#endif

View File

@ -70,7 +70,7 @@ int mosquitto_pub_topic_check(const char *str)
len++;
str = &str[1];
}
if(len > 65535) return MOSQ_ERR_INVAL;
if(len == 0 || len > 65535) return MOSQ_ERR_INVAL;
#ifdef WITH_BROKER
if(hier_count > TOPIC_HIERARCHY_LIMIT) return MOSQ_ERR_INVAL;
#endif
@ -85,7 +85,7 @@ int mosquitto_pub_topic_check2(const char *str, size_t len)
int hier_count = 0;
#endif
if(str == NULL || len > 65535){
if(str == NULL || len == 0 || len > 65535){
return MOSQ_ERR_INVAL;
}
@ -144,7 +144,7 @@ int mosquitto_sub_topic_check(const char *str)
c = str[0];
str = &str[1];
}
if(len > 65535) return MOSQ_ERR_INVAL;
if(len == 0 || len > 65535) return MOSQ_ERR_INVAL;
#ifdef WITH_BROKER
if(hier_count > TOPIC_HIERARCHY_LIMIT) return MOSQ_ERR_INVAL;
#endif
@ -160,7 +160,7 @@ int mosquitto_sub_topic_check2(const char *str, size_t len)
int hier_count = 0;
#endif
if(str == NULL || len > 65535){
if(str == NULL || len == 0 || len > 65535){
return MOSQ_ERR_INVAL;
}

View File

@ -987,6 +987,34 @@ log_timestamp_format %Y-%m-%dT%H:%M:%S
<para>Reloaded on reload signal.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>retain_expiry_interval</option> <replaceable>minutes</replaceable></term>
<listitem>
<para>
The default behaviour of mosquitto is to remove retained
messages that have reached their message-expiry-interval
property the next time that that message is accessed -
either by being replaced by a new message, or on the
next subscription that matches the message. If you have
a pattern of publishing many retained messages with a
message-expiry-interval, but that are not subscribed to,
then the expired retained messages will remain in
memory. This option configures the broker to
periodically check the retained tree for expired
messages.
</para>
<para>
Defaults to off. Setting to a value greater than zero
means the broker will make a check at an interval of
that number of minutes.
</para>
<para>This option applies globally.</para>
<para>Reloaded on reload signal.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>set_tcp_nodelay</option> [ true | false ]</term>
<listitem>
@ -1326,6 +1354,7 @@ log_timestamp_format %Y-%m-%dT%H:%M:%S
"openssl rehash &lt;path to capath&gt;" each time
you add/remove a certificate.
</para>
<para><option>capath</option> is not supported for websockets.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -65,6 +65,7 @@
<arg choice='plain'><option>--psk</option> <replaceable>hex-key</replaceable></arg>
<arg choice='plain'><option>--psk-identity</option> <replaceable>identity</replaceable></arg>
<arg><option>--ciphers</option> <replaceable>ciphers</replaceable></arg>
<arg><option>--tls-use-os-certs</option></arg>
<arg><option>--tls-version</option> <replaceable>version</replaceable></arg>
</arg>
</group>
@ -441,6 +442,20 @@
<para>See also <option>--tls-engine</option>.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--tls-use-os-certs</option></term>
<listitem>
<para>
If used, this will load and trust the OS provided CA
certificates. This can be used in conjunction with
<option>--cafile</option> and <option>--capath</option>
and can be used on its own to enable TLS mode. This
will be set by default if <option>-L mqtts://...</option>
is used, or if port is 8883 and no other certificate
options are used.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--tls-version</option></term>
<listitem>

View File

@ -191,7 +191,7 @@
<para>Define the path to a file containing a PEM encoded
certificate for this client, if required by the
server.</para>
<para>See also <option>--key</option>.</para>
<para>See also <option>--key</option> and the Encrypted Connections section.</para>
</listitem>
</varlistentry>
<varlistentry>
@ -322,7 +322,7 @@
<para>Define the path to a file containing a PEM encoded
private key for this client, if required by the
server.</para>
<para>See also <option>--cert</option>.</para>
<para>See also <option>--cert</option> and the Encrypted Connections section.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -202,7 +202,7 @@
<para>Define the path to a file containing a PEM encoded
certificate for this client, if required by the
server.</para>
<para>See also <option>--key</option>.</para>
<para>See also <option>--key</option> and the Encrypted Connections section.</para>
</listitem>
</varlistentry>
<varlistentry>
@ -351,7 +351,7 @@
<para>Define the path to a file containing a PEM encoded
private key for this client, if required by the
server.</para>
<para>See also <option>--cert</option>.</para>
<para>See also <option>--cert</option> and the Encrypted Connections section.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -204,7 +204,7 @@
<para>Define the path to a file containing a PEM encoded
certificate for this client, if required by the
server.</para>
<para>See also <option>--key</option>.</para>
<para>See also <option>--key</option> and the Encrypted Connections section.</para>
</listitem>
</varlistentry>
<varlistentry>
@ -365,7 +365,7 @@
<para>Define the path to a file containing a PEM encoded
private key for this client, if required by the
server.</para>
<para>See also <option>--cert</option>.</para>
<para>See also <option>--cert</option> and the Encrypted Connections section.</para>
</listitem>
</varlistentry>
<varlistentry>

View File

@ -359,6 +359,7 @@
# containing the CA certificates. For capath to work correctly, the
# certificate files must have ".crt" as the file ending and you must run
# "openssl rehash <path to capath>" each time you add/remove a certificate.
# capath is not supported for websockets.
#cafile
#capath

View File

@ -2,7 +2,7 @@
MAJOR=2
MINOR=0
REVISION=20
REVISION=21
sed -i "s/^VERSION=.*/VERSION=${MAJOR}.${MINOR}.${REVISION}/" config.mk

View File

@ -1,5 +1,5 @@
name: mosquitto
version: 2.0.20
version: 2.0.21
summary: Eclipse Mosquitto MQTT broker
description: This is a message broker that supports version 5.0, 3.1.1, and 3.1 of the MQTT protocol.
MQTT provides a method of carrying out messaging using a publish/subscribe

View File

@ -313,10 +313,10 @@ xtreport.o : xtreport.c
${CROSS_COMPILE}${CC} $(BROKER_CPPFLAGS) $(BROKER_CFLAGS) -c $< -o $@
plugin_defer.so : plugin_defer.c ../include/mosquitto_plugin.h ../include/mosquitto_broker.h mosquitto_broker_internal.h
${CROSS_COMPILE}${CC} -I. -I../lib -fPIC -shared $< -o $@
${CROSS_COMPILE}${CC} -I. -I../lib -I../include -fPIC -shared $< -o $@
plugin_debug.so : plugin_debug.c ../include/mosquitto_plugin.../include/h mosquitto_broker.h mosquitto_broker_internal.h
${CROSS_COMPILE}${CC} -I. -I../lib -fPIC -shared $< -o $@
plugin_debug.so : plugin_debug.c ../include/mosquitto_plugin.h ../include/mosquitto_broker.h mosquitto_broker_internal.h
${CROSS_COMPILE}${CC} -I. -I../lib -I../include -fPIC -shared $< -o $@
install : all
$(INSTALL) -d "${DESTDIR}$(prefix)/sbin"

View File

@ -59,9 +59,11 @@ static int bridge__create_prefix(char **full_prefix, const char *topic, const ch
{
size_t len;
if(mosquitto_pub_topic_check(prefix) != MOSQ_ERR_SUCCESS){
log__printf(NULL, MOSQ_LOG_ERR, "Error: Invalid bridge topic local prefix '%s'.", prefix);
return MOSQ_ERR_INVAL;
if(!prefix || strlen(prefix) != 0){
if(mosquitto_pub_topic_check(prefix) != MOSQ_ERR_SUCCESS){
log__printf(NULL, MOSQ_LOG_ERR, "Error: Invalid bridge topic local prefix '%s'.", prefix);
return MOSQ_ERR_INVAL;
}
}
if(topic){

View File

@ -201,6 +201,7 @@ static void config__init_reload(struct mosquitto__config *config)
config->persistent_client_expiration = 0;
config->queue_qos0_messages = false;
config->retain_available = true;
config->retain_expiry_interval = 0;
config->set_tcp_nodelay = false;
config->sys_interval = 10;
config->upgrade_outgoing_qos = false;
@ -636,9 +637,7 @@ int config__read(struct mosquitto__config *config, bool reload)
}
/* If auth/access options are set and allow_anonymous not explicitly set, disallow anon. */
if(config->local_only == true){
config->security_options.allow_anonymous = true;
}else{
if(config->local_only == false){
if(config->per_listener_settings){
for(i=0; i<config->listener_count; i++){
/* Default option if no security options set */
@ -1919,6 +1918,9 @@ static int config__read_file_core(struct mosquitto__config *config, bool reload,
#endif
}else if(!strcmp(token, "retain_available")){
if(conf__parse_bool(&token, token, &config->retain_available, saveptr)) return MOSQ_ERR_INVAL;
}else if(!strcmp(token, "retain_expiry_interval")){
if(conf__parse_int(&token, token, &config->retain_expiry_interval, saveptr)) return MOSQ_ERR_INVAL;
config->retain_expiry_interval *= 60;
}else if(!strcmp(token, "retry_interval")){
log__printf(NULL, MOSQ_LOG_WARNING, "Warning: The retry_interval option is no longer available.");
}else if(!strcmp(token, "round_robin")){
@ -2241,17 +2243,14 @@ static int config__check(struct mosquitto__config *config)
{
/* Checks that are easy to make after the config has been loaded. */
int i;
#ifdef WITH_BRIDGE
int j;
struct mosquitto__bridge *bridge1, *bridge2;
char hostname[256];
size_t len;
/* Check for bridge duplicate local_clientid, need to generate missing IDs
* first. */
for(i=0; i<config->bridge_count; i++){
for(int i=0; i<config->bridge_count; i++){
bridge1 = &config->bridges[i];
if(!bridge1->remote_clientid){
@ -2278,9 +2277,9 @@ static int config__check(struct mosquitto__config *config)
}
}
for(i=0; i<config->bridge_count; i++){
for(int i=0; i<config->bridge_count; i++){
bridge1 = &config->bridges[i];
for(j=i+1; j<config->bridge_count; j++){
for(int j=i+1; j<config->bridge_count; j++){
bridge2 = &config->bridges[j];
if(!strcmp(bridge1->local_clientid, bridge2->local_clientid)){
log__printf(NULL, MOSQ_LOG_ERR, "Error: Bridge local_clientid "
@ -2295,7 +2294,7 @@ static int config__check(struct mosquitto__config *config)
/* Default to auto_id_prefix = 'auto-' if none set. */
if(config->per_listener_settings){
for(i=0; i<config->listener_count; i++){
for(int i=0; i<config->listener_count; i++){
if(!config->listeners[i].security_options.auto_id_prefix){
config->listeners[i].security_options.auto_id_prefix = mosquitto__strdup("auto-");
if(!config->listeners[i].security_options.auto_id_prefix){
@ -2314,6 +2313,26 @@ static int config__check(struct mosquitto__config *config)
}
}
/* Check for missing TLS cafile/capath/certfile/keyfile */
for(int i=0; i<config->listener_count; i++){
bool cafile = !!config->listeners[i].cafile;
bool capath = !!config->listeners[i].capath;
bool certfile = !!config->listeners[i].certfile;
bool keyfile = !!config->listeners[i].keyfile;
if((certfile && !keyfile) || (!certfile && keyfile)){
log__printf(NULL, MOSQ_LOG_ERR, "Error: Both certfile and keyfile must be provided to enable a TLS listener.");
return MOSQ_ERR_INVAL;
}
if(cafile && !certfile){
log__printf(NULL, MOSQ_LOG_ERR, "Error: cafile specified without certfile and keyfile.");
return MOSQ_ERR_INVAL;
}
if(capath && !certfile){
log__printf(NULL, MOSQ_LOG_ERR, "Error: capath specified without certfile and keyfile.");
return MOSQ_ERR_INVAL;
}
}
return MOSQ_ERR_SUCCESS;
}

View File

@ -139,6 +139,7 @@ void context__cleanup(struct mosquitto *context, bool force_free)
#endif
alias__free_all(context);
keepalive__remove(context);
context__cleanup_out_packets(context);
mosquitto__free(context->auth_method);

View File

@ -269,7 +269,9 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1
if(db.config->max_keepalive &&
(context->keepalive > db.config->max_keepalive || context->keepalive == 0)){
keepalive__remove(context);
context->keepalive = db.config->max_keepalive;
keepalive__add(context);
if(context->protocol == mosq_p_mqtt5){
if(mosquitto_property_add_int16(&connack_props, MQTT_PROP_SERVER_KEEP_ALIVE, context->keepalive)){
rc = MOSQ_ERR_NOMEM;
@ -312,8 +314,6 @@ int connect__on_authorised(struct mosquitto *context, void *auth_data_out, uint1
free(auth_data_out);
auth_data_out = NULL;
keepalive__add(context);
mosquitto__set_state(context, mosq_cs_active);
rc = send__connack(context, connect_ack, CONNACK_ACCEPTED, connack_props);
mosquitto_property_free_all(&connack_props);
@ -577,10 +577,15 @@ int handle__connect(struct mosquitto *context)
goto handle_connect_error;
}
/* _remove here because net__socket_accept() uses _add and we must have the
* correct keepalive value */
keepalive__remove(context);
if(packet__read_uint16(&context->in_packet, &(context->keepalive))){
rc = MOSQ_ERR_PROTOCOL;
goto handle_connect_error;
}
keepalive__add(context);
if(protocol_version == PROTOCOL_VERSION_v5){
rc = property__read_all(CMD_CONNECT, &context->in_packet, &properties);

View File

@ -100,136 +100,137 @@ int handle__subscribe(struct mosquitto *context)
return MOSQ_ERR_MALFORMED_PACKET;
}
if(sub){
if(!slen){
log__printf(NULL, MOSQ_LOG_INFO,
"Empty subscription string from %s, disconnecting.",
context->address);
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
if(mosquitto_sub_topic_check(sub)){
log__printf(NULL, MOSQ_LOG_INFO,
"Invalid subscription string from %s, disconnecting.",
context->address);
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
if(packet__read_byte(&context->in_packet, &subscription_options)){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
if(context->protocol == mosq_p_mqtt31 || context->protocol == mosq_p_mqtt311){
qos = subscription_options;
if(context->is_bridge){
subscription_options = MQTT_SUB_OPT_RETAIN_AS_PUBLISHED | MQTT_SUB_OPT_NO_LOCAL;
}
}else{
qos = subscription_options & 0x03;
subscription_options &= 0xFC;
if((subscription_options & MQTT_SUB_OPT_NO_LOCAL) && !strncmp(sub, "$share/", 7)){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_PROTOCOL;
}
retain_handling = (subscription_options & 0x30);
if(retain_handling == 0x30 || (subscription_options & 0xC0) != 0){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
}
if(qos > 2){
log__printf(NULL, MOSQ_LOG_INFO,
"Invalid QoS in subscription command from %s, disconnecting.",
context->address);
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
if(qos > context->max_qos){
qos = context->max_qos;
}
if(context->listener && context->listener->mount_point){
len = strlen(context->listener->mount_point) + slen + 1;
sub_mount = mosquitto__malloc(len+1);
if(!sub_mount){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_NOMEM;
}
snprintf(sub_mount, len, "%s%s", context->listener->mount_point, sub);
sub_mount[len] = '\0';
mosquitto__free(sub);
sub = sub_mount;
}
log__printf(NULL, MOSQ_LOG_DEBUG, "\t%s (QoS %d)", sub, qos);
allowed = true;
rc2 = mosquitto_acl_check(context, sub, 0, NULL, qos, false, MOSQ_ACL_SUBSCRIBE);
switch(rc2){
case MOSQ_ERR_SUCCESS:
break;
case MOSQ_ERR_ACL_DENIED:
allowed = false;
if(context->protocol == mosq_p_mqtt5){
qos = MQTT_RC_NOT_AUTHORIZED;
}else if(context->protocol == mosq_p_mqtt311){
qos = 0x80;
}
break;
default:
mosquitto__free(sub);
return rc2;
}
if(allowed){
rc2 = sub__add(context, sub, qos, subscription_identifier, subscription_options);
if(rc2 > 0){
mosquitto__free(sub);
return rc2;
}
if(context->protocol == mosq_p_mqtt311 || context->protocol == mosq_p_mqtt31){
if(rc2 == MOSQ_ERR_SUCCESS || rc2 == MOSQ_ERR_SUB_EXISTS){
if(retain__queue(context, sub, qos, 0)) rc = 1;
}
}else{
if((retain_handling == MQTT_SUB_OPT_SEND_RETAIN_ALWAYS)
|| (rc2 == MOSQ_ERR_SUCCESS && retain_handling == MQTT_SUB_OPT_SEND_RETAIN_NEW)){
if(retain__queue(context, sub, qos, subscription_identifier)) rc = 1;
}
}
log__printf(NULL, MOSQ_LOG_SUBSCRIBE, "%s %d %s", context->id, qos, sub);
}
if(!slen){
log__printf(NULL, MOSQ_LOG_INFO,
"Empty subscription string from %s, disconnecting.",
context->address);
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
if(mosquitto_sub_topic_check(sub)){
log__printf(NULL, MOSQ_LOG_INFO,
"Invalid subscription string from %s, disconnecting.",
context->address);
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
tmp_payload = mosquitto__realloc(payload, payloadlen + 1);
if(tmp_payload){
payload = tmp_payload;
payload[payloadlen] = qos;
payloadlen++;
}else{
if(packet__read_byte(&context->in_packet, &subscription_options)){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
if(context->protocol == mosq_p_mqtt31 || context->protocol == mosq_p_mqtt311){
qos = subscription_options;
if(context->is_bridge){
subscription_options = MQTT_SUB_OPT_RETAIN_AS_PUBLISHED | MQTT_SUB_OPT_NO_LOCAL;
}
}else{
qos = subscription_options & 0x03;
subscription_options &= 0xFC;
if((subscription_options & MQTT_SUB_OPT_NO_LOCAL) && !strncmp(sub, "$share/", 7)){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_PROTOCOL;
}
retain_handling = (subscription_options & 0x30);
if(retain_handling == 0x30 || (subscription_options & 0xC0) != 0){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
}
if(qos > 2){
log__printf(NULL, MOSQ_LOG_INFO,
"Invalid QoS in subscription command from %s, disconnecting.",
context->address);
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_MALFORMED_PACKET;
}
if(qos > context->max_qos){
qos = context->max_qos;
}
if(context->listener && context->listener->mount_point){
len = strlen(context->listener->mount_point) + slen + 1;
sub_mount = mosquitto__malloc(len+1);
if(!sub_mount){
mosquitto__free(sub);
mosquitto__free(payload);
return MOSQ_ERR_NOMEM;
}
snprintf(sub_mount, len, "%s%s", context->listener->mount_point, sub);
sub_mount[len] = '\0';
mosquitto__free(sub);
sub = sub_mount;
}
log__printf(NULL, MOSQ_LOG_DEBUG, "\t%s (QoS %d)", sub, qos);
allowed = true;
rc2 = mosquitto_acl_check(context, sub, 0, NULL, qos, false, MOSQ_ACL_SUBSCRIBE);
switch(rc2){
case MOSQ_ERR_SUCCESS:
break;
case MOSQ_ERR_ACL_DENIED:
allowed = false;
if(context->protocol == mosq_p_mqtt5){
qos = MQTT_RC_NOT_AUTHORIZED;
}else if(context->protocol == mosq_p_mqtt311){
qos = 0x80;
}
break;
default:
mosquitto__free(sub);
mosquitto__free(payload);
return rc2;
}
if(allowed){
rc2 = sub__add(context, sub, qos, subscription_identifier, subscription_options);
if(rc2 > 0){
mosquitto__free(sub);
mosquitto__free(payload);
return rc2;
}
if(context->protocol == mosq_p_mqtt311 || context->protocol == mosq_p_mqtt31){
if(rc2 == MOSQ_ERR_SUCCESS || rc2 == MOSQ_ERR_SUB_EXISTS){
if(retain__queue(context, sub, qos, 0)) rc = 1;
}
}else{
if((retain_handling == MQTT_SUB_OPT_SEND_RETAIN_ALWAYS)
|| (rc2 == MOSQ_ERR_SUCCESS && retain_handling == MQTT_SUB_OPT_SEND_RETAIN_NEW)){
if(retain__queue(context, sub, qos, subscription_identifier)) rc = 1;
}
}
log__printf(NULL, MOSQ_LOG_SUBSCRIBE, "%s %d %s", context->id, qos, sub);
}
mosquitto__free(sub);
tmp_payload = mosquitto__realloc(payload, payloadlen + 1);
if(tmp_payload){
payload = tmp_payload;
payload[payloadlen] = qos;
payloadlen++;
}else{
mosquitto__free(payload);
return MOSQ_ERR_NOMEM;
}
}
if(context->protocol != mosq_p_mqtt31){
if(payloadlen == 0){
/* No subscriptions specified, protocol error. */
fprintf(stderr, "no payload\n");
return MOSQ_ERR_MALFORMED_PACKET;
}
}

View File

@ -1,5 +1,5 @@
/*
Copyright (c) 2009-2020 Roger Light <roger@atchoo.org>
Copyright (c) 2009-2021 Roger Light <roger@atchoo.org>
All rights reserved. This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
@ -19,30 +19,147 @@ Contributors:
#include "config.h"
#include <time.h>
#include "mosquitto_broker_internal.h"
#include <utlist.h>
/* This contains code for checking whether clients have exceeded their keepalive timeouts.
* There are two versions.
*
* The old version can be used by compiling with `make WITH_OLD_KEEPALIVE=yes`.
* It will scan the entire list of connected clients every 5 seconds to see if
* they have expired. Hence it scales with O(n) and with e.g. 60000 clients can
* have a measurable effect on CPU usage in the low single digit percent range.
*
* The new version scales with O(1). It uses a ring buffer that contains
* max_keepalive*1.5+1 entries. The current time in integer seconds, modulus
* the number of entries, points to the head of the ring buffer. Any clients
* will appear after this point at the position indexed by the time at which
* they will expire if they do not send another message, assuming they do not
* have keepalive==0 - in which case they are not part of this check. So a
* client that connects with keepalive=60 will be added at `now + 60*1.5`.
*
* A client is added to an entry with a doubly linked list. When the client
* sends a new message, it is removed from the old position and added to the
* new.
*
* As time moves on, if the linked list at the current entry is not empty, all
* of the clients are expired.
*
* The ring buffer size is determined by max_keepalive. At the default, it is
* 65535*1.5+1=98303 entries long. On a 64-bit machine that is 786424 bytes.
* If this is too big a burden and you do not need many clients connected, then
* the old check is sufficient. You can reduce the number of entries by setting
* a lower max_keepalive value. A value as low as 600 still gives a 10 minute
* keepalive and reduces the memory for the ring buffer to 7208 bytes.
*
* *NOTE* It is likely that the old check routine will be removed in the
* future, and max_keepalive set to a sensible default value. If this is a
* problem for you please get in touch.
*/
static time_t last_keepalive_check = 0;
#ifndef WITH_OLD_KEEPALIVE
static int keepalive_list_max = 0;
static struct mosquitto **keepalive_list = NULL;
#endif
/* FIXME - this is the prototype for the future tree/trie based keepalive check implementation. */
#ifndef WITH_OLD_KEEPALIVE
static int calc_index(struct mosquitto *context)
{
return (int)(context->last_msg_in + context->keepalive*3/2) % keepalive_list_max;
}
#endif
int keepalive__init(void)
{
#ifndef WITH_OLD_KEEPALIVE
struct mosquitto *context, *ctxt_tmp;
last_keepalive_check = db.now_s;
if(db.config->max_keepalive <= 0){
keepalive_list_max = (UINT16_MAX * 3)/2 + 1;
}else{
keepalive_list_max = (db.config->max_keepalive * 3)/2 + 1;
}
keepalive_list = mosquitto_calloc((size_t)keepalive_list_max, sizeof(struct mosquitto *));
if(keepalive_list == NULL){
log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory.");
keepalive_list_max = 0;
return MOSQ_ERR_NOMEM;
}
/* Add existing clients - should only be applicable on MOSQ_EVT_RELOAD */
HASH_ITER(hh_sock, db.contexts_by_sock, context, ctxt_tmp){
if(net__is_connected(context) && !context->bridge && context->keepalive > 0){
keepalive__add(context);
}
}
#endif
return MOSQ_ERR_SUCCESS;
}
void keepalive__cleanup(void)
{
#ifndef WITH_OLD_KEEPALIVE
mosquitto_free(keepalive_list);
keepalive_list = NULL;
keepalive_list_max = 0;
#endif
}
int keepalive__add(struct mosquitto *context)
{
UNUSED(context);
#ifndef WITH_OLD_KEEPALIVE
if(context->keepalive <= 0 || !net__is_connected(context)) return MOSQ_ERR_SUCCESS;
#ifdef WITH_BRIDGE
if(context->bridge) return MOSQ_ERR_SUCCESS;
#endif
DL_APPEND2(keepalive_list[calc_index(context)], context, keepalive_prev, keepalive_next);
#else
UNUSED(context);
#endif
return MOSQ_ERR_SUCCESS;
}
#ifndef WITH_OLD_KEEPALIVE
void keepalive__check(void)
{
struct mosquitto *context, *ctxt_tmp;
if(last_keepalive_check + 5 < db.now_s){
for(time_t i=last_keepalive_check; i<db.now_s; i++){
int idx = (int)(i % keepalive_list_max);
if(keepalive_list[idx]){
DL_FOREACH_SAFE2(keepalive_list[idx], context, ctxt_tmp, keepalive_next){
if(net__is_connected(context)){
/* Client has exceeded keepalive*1.5 */
do_disconnect(context, MOSQ_ERR_KEEPALIVE);
}
}
}
}
last_keepalive_check = db.now_s;
}
#else
void keepalive__check(void)
{
struct mosquitto *context, *ctxt_tmp;
time_t timeout;
if(db.contexts_by_sock){
timeout = (last_keepalive_check + 5 - db.now_s);
if(timeout <= 0){
timeout = 5;
}
loop__update_next_event(timeout*1000);
}
if(last_keepalive_check + 5 <= db.now_s){
last_keepalive_check = db.now_s;
/* FIXME - this needs replacing with something more efficient */
HASH_ITER(hh_sock, db.contexts_by_sock, context, ctxt_tmp){
if(context->sock != INVALID_SOCKET){
if(net__is_connected(context)){
/* Local bridges never time out in this fashion. */
if(!(context->keepalive)
|| context->bridge
@ -56,23 +173,38 @@ void keepalive__check(void)
}
}
}
#endif
int keepalive__remove(struct mosquitto *context)
{
#ifndef WITH_OLD_KEEPALIVE
int idx;
if(context->keepalive <= 0 || context->keepalive_prev == NULL) return MOSQ_ERR_SUCCESS;
idx = calc_index(context);
if(keepalive_list[idx]){
DL_DELETE2(keepalive_list[idx], context, keepalive_prev, keepalive_next);
context->keepalive_next = NULL;
context->keepalive_prev = NULL;
}
#else
UNUSED(context);
#endif
return MOSQ_ERR_SUCCESS;
}
void keepalive__remove_all(void)
{
}
int keepalive__update(struct mosquitto *context)
{
#ifndef WITH_OLD_KEEPALIVE
keepalive__remove(context);
/* coverity[missing_lock] - broker is single threaded, so no lock required */
context->last_msg_in = db.now_s;
keepalive__add(context);
#else
UNUSED(context);
#endif
return MOSQ_ERR_SUCCESS;
}

View File

@ -187,6 +187,7 @@ int mosquitto_main_loop(struct mosquitto__listener_sock *listensock, int listens
#endif
while(run){
retain__expire();
queue_plugin_msgs();
context__free_disused();
#ifdef WITH_SYS_TREE
@ -237,6 +238,8 @@ int mosquitto_main_loop(struct mosquitto__listener_sock *listensock, int listens
mosquitto_security_apply();
log__close(db.config);
log__init(db.config);
keepalive__cleanup();
keepalive__init();
flag_reload = false;
}
if(flag_tree_print){

View File

@ -279,10 +279,17 @@ void listeners__add_websockets(struct lws_context *ws_context, mosq_sock_t fd)
static int listeners__add_local(const char *host, uint16_t port)
{
struct mosquitto__listener *listeners;
bool allow_anonymous;
listeners = db.config->listeners;
if(db.config->security_options.allow_anonymous == -1){
allow_anonymous = true;
}else{
allow_anonymous = db.config->security_options.allow_anonymous;
}
listener__set_defaults(&listeners[db.config->listener_count]);
listeners[db.config->listener_count].security_options.allow_anonymous = true;
listeners[db.config->listener_count].security_options.allow_anonymous = allow_anonymous;
listeners[db.config->listener_count].port = port;
listeners[db.config->listener_count].host = mosquitto__strdup(host);
if(listeners[db.config->listener_count].host == NULL){
@ -502,6 +509,11 @@ int main(int argc, char *argv[])
if(rc != MOSQ_ERR_SUCCESS) return rc;
db.config = &config;
rc = keepalive__init();
if(rc){
return rc;
}
/* Drop privileges permanently immediately after the config is loaded.
* This requires the user to ensure that all certificates, log locations,
* etc. are accessible my the `mosquitto` or other unprivileged user.
@ -611,6 +623,7 @@ int main(int argc, char *argv[])
mosquitto__free(db.bridges);
#endif
context__free_disused();
keepalive__cleanup();
db__close();

View File

@ -291,6 +291,7 @@ struct mosquitto__config {
bool queue_qos0_messages;
bool per_listener_settings;
bool retain_available;
int retain_expiry_interval;
bool set_tcp_nodelay;
int sys_interval;
bool upgrade_outgoing_qos;
@ -771,10 +772,11 @@ void plugin__handle_tick(void);
/* ============================================================
* Property related functions
* ============================================================ */
int keepalive__init(void);
void keepalive__cleanup(void);
int keepalive__add(struct mosquitto *context);
void keepalive__check(void);
int keepalive__remove(struct mosquitto *context);
void keepalive__remove_all(void);
int keepalive__update(struct mosquitto *context);
/* ============================================================
@ -791,6 +793,7 @@ int retain__init(void);
void retain__clean(struct mosquitto__retainhier **retainhier);
int retain__queue(struct mosquitto *context, const char *sub, uint8_t sub_qos, uint32_t subscription_identifier);
int retain__store(const char *topic, struct mosquitto_msg_store *stored, char **split_topics);
void retain__expire(void);
/* ============================================================
* Security related functions

View File

@ -246,6 +246,8 @@ struct mosquitto *net__socket_accept(struct mosquitto__listener_sock *listensock
new_context->address, new_context->remote_port, new_context->listener->port);
}
keepalive__add(new_context);
return new_context;
}
@ -672,6 +674,9 @@ static int net__bind_interface(struct mosquitto__listener *listener, struct addr
memcpy(&((struct sockaddr_in6 *)rp->ai_addr)->sin6_addr,
&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr,
sizeof(struct in6_addr));
((struct sockaddr_in6 *)rp->ai_addr)->sin6_scope_id = ((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_scope_id;
freeifaddrs(ifaddr);
return MOSQ_ERR_SUCCESS;
}

View File

@ -34,10 +34,10 @@ void print_col(struct mosquitto *client)
{
switch(mosquitto_client_protocol(client)){
case mp_mqtt:
printf("%s", ANSI_GREEN);
fprintf(stderr, "%s", ANSI_GREEN);
break;
case mp_websockets:
printf("%s", ANSI_MAGENTA);
fprintf(stderr, "%s", ANSI_MAGENTA);
break;
default:
break;
@ -46,54 +46,58 @@ void print_col(struct mosquitto *client)
int mosquitto_auth_plugin_version(void)
{
printf(ANSI_BLUE "PLUGIN ::: mosquitto_auth_plugin_version()" ANSI_RESET "\n");
fprintf(stderr, ANSI_BLUE "PLUGIN ::: mosquitto_auth_plugin_version()" ANSI_RESET "\n");
return 4;
}
int mosquitto_auth_plugin_init(void **user_data, struct mosquitto_opt *auth_opts, int auth_opt_count)
{
printf(ANSI_BLUE "PLUGIN ::: mosquitto_auth_plugin_init(,,%d)" ANSI_RESET "\n", auth_opt_count);
fprintf(stderr, ANSI_BLUE "PLUGIN ::: mosquitto_auth_plugin_init(,,%d)" ANSI_RESET "\n", auth_opt_count);
return MOSQ_ERR_SUCCESS;
}
int mosquitto_auth_plugin_cleanup(void *user_data, struct mosquitto_opt *auth_opts, int auth_opt_count)
{
printf(ANSI_BLUE "PLUGIN ::: mosquitto_auth_plugin_cleanup(,,%d)" ANSI_RESET "\n", auth_opt_count);
fprintf(stderr, ANSI_BLUE "PLUGIN ::: mosquitto_auth_plugin_cleanup(,,%d)" ANSI_RESET "\n", auth_opt_count);
return MOSQ_ERR_SUCCESS;
}
int mosquitto_auth_security_init(void *user_data, struct mosquitto_opt *auth_opts, int auth_opt_count, bool reload)
{
printf(ANSI_BLUE "PLUGIN ::: mosquitto_auth_security_init(,,%d, %d)" ANSI_RESET "\n", auth_opt_count, reload);
fprintf(stderr, ANSI_BLUE "PLUGIN ::: mosquitto_auth_security_init(,,%d, %d)" ANSI_RESET "\n", auth_opt_count, reload);
return MOSQ_ERR_SUCCESS;
}
int mosquitto_auth_security_cleanup(void *user_data, struct mosquitto_opt *auth_opts, int auth_opt_count, bool reload)
{
printf(ANSI_BLUE "PLUGIN ::: mosquitto_auth_security_cleanup(,,%d, %d)" ANSI_RESET "\n", auth_opt_count, reload);
fprintf(stderr, ANSI_BLUE "PLUGIN ::: mosquitto_auth_security_cleanup(,,%d, %d)" ANSI_RESET "\n", auth_opt_count, reload);
return MOSQ_ERR_SUCCESS;
}
int mosquitto_auth_acl_check(void *user_data, int access, struct mosquitto *client, const struct mosquitto_acl_msg *msg)
{
print_col(client);
printf("PLUGIN ::: mosquitto_auth_acl_check(%p, %d, %s, %s)" ANSI_RESET "\n",
fprintf(stderr, "PLUGIN ::: mosquitto_auth_acl_check(%p, %d, %s, %s)" ANSI_RESET "\n",
user_data, access, mosquitto_client_username(client), msg->topic);
return MOSQ_ERR_SUCCESS;
}
int mosquitto_auth_unpwd_check(void *user_data, struct mosquitto *client, const char *username, const char *password)
{
const char *client_id = mosquitto_client_id(client);
const char *ip_address = mosquitto_client_address(client);
const void *cert = mosquitto_client_certificate(client);
print_col(client);
printf("PLUGIN ::: mosquitto_auth_unpwd_check(%p, %s, %s)" ANSI_RESET "\n",
user_data, mosquitto_client_username(client), username);
fprintf(stderr, "PLUGIN ::: mosquitto_auth_unpwd_check(%p, %s, %s, id=%s, ip=%s, cert=%p)" ANSI_RESET "\n",
user_data, mosquitto_client_username(client), username, client_id, ip_address, cert);
return MOSQ_ERR_SUCCESS;
}
int mosquitto_auth_psk_key_get(void *user_data, struct mosquitto *client, const char *hint, const char *identity, char *key, int max_key_len)
{
print_col(client);
printf("PLUGIN ::: mosquitto_auth_psk_key_get(%p, %s, %s)" ANSI_RESET "\n",
fprintf(stderr, "PLUGIN ::: mosquitto_auth_psk_key_get(%p, %s, %s)" ANSI_RESET "\n",
user_data, mosquitto_client_username(client), hint);
return MOSQ_ERR_SUCCESS;
}
@ -101,7 +105,7 @@ int mosquitto_auth_psk_key_get(void *user_data, struct mosquitto *client, const
int mosquitto_auth_start(void *user_data, struct mosquitto *client, const char *method, bool reauth, const void *data_in, uint16_t data_in_len, void **data_out, uint16_t *data_out_len)
{
print_col(client);
printf("PLUGIN ::: mosquitto_auth_start(%p, %s, %s, %d, %d, %hn)" ANSI_RESET "\n",
fprintf(stderr, "PLUGIN ::: mosquitto_auth_start(%p, %s, %s, %d, %d, %hn)" ANSI_RESET "\n",
user_data, mosquitto_client_username(client), method, reauth, data_in_len, data_out_len);
return MOSQ_ERR_SUCCESS;
}
@ -109,7 +113,7 @@ int mosquitto_auth_start(void *user_data, struct mosquitto *client, const char *
int mosquitto_auth_continue(void *user_data, struct mosquitto *client, const char *method, const void *data_in, uint16_t data_in_len, void **data_out, uint16_t *data_out_len)
{
print_col(client);
printf("PLUGIN ::: mosquitto_auth_continue(%p, %s, %s, %d, %hn)" ANSI_RESET "\n",
fprintf(stderr, "PLUGIN ::: mosquitto_auth_continue(%p, %s, %s, %d, %hn)" ANSI_RESET "\n",
user_data, mosquitto_client_username(client), method, data_in_len, data_out_len);
return MOSQ_ERR_SUCCESS;
}

View File

@ -29,6 +29,8 @@ Contributors:
#include "utlist.h"
static time_t next_expire_check = 0;
static struct mosquitto__retainhier *retain__add_hier_entry(struct mosquitto__retainhier *parent, struct mosquitto__retainhier **sibling, const char *topic, uint16_t len)
{
struct mosquitto__retainhier *child;
@ -320,3 +322,32 @@ void retain__clean(struct mosquitto__retainhier **retainhier)
}
}
static void retain__expire_search(struct mosquitto__retainhier *retainhier)
{
struct mosquitto__retainhier *branch, *branch_tmp;
HASH_ITER(hh, retainhier->children, branch, branch_tmp){
if(branch->children){
retain__expire_search(branch);
}
if(branch->retained){
if(branch->retained->message_expiry_time > 0 && db.now_real_s >= branch->retained->message_expiry_time){
db__msg_store_ref_dec(&branch->retained);
branch->retained = NULL;
#ifdef WITH_SYS_TREE
db.retained_count--;
#endif
retain__clean_empty_hierarchy(retainhier);
}
}
}
}
void retain__expire(void)
{
if(db.config->retain_expiry_interval > 0 && db.now_s > next_expire_check){
retain__expire_search(db.retains);
next_expire_check = db.now_s + db.config->retain_expiry_interval;
}
}

View File

@ -578,6 +578,10 @@ static int callback_http(
return -1;
}
wlen = (size_t)rc;
/* while still active, extend timeout */
if(wlen){
lws_set_timeout(wsi, PENDING_TIMEOUT_HTTP_CONTENT, 10);
}
if(wlen < buflen){
if(fseek(u->fptr, (long)(buflen-wlen), SEEK_CUR) < 0){
fclose(u->fptr);
@ -698,7 +702,12 @@ void mosq_websockets_init(struct mosquitto__listener *listener, const struct mos
info.gid = -1;
info.uid = -1;
#ifdef WITH_TLS
info.ssl_ca_filepath = listener->cafile;
if(listener->cafile){
info.ssl_ca_filepath = listener->cafile;
}
else if(listener->capath){
log__printf(NULL, MOSQ_LOG_WARNING, "Warning: CA path option is not supported for websockets");
}
info.ssl_cert_filepath = listener->certfile;
info.ssl_private_key_filepath = listener->keyfile;
info.ssl_cipher_list = listener->ciphers;

View File

@ -26,6 +26,14 @@ def write_config5(filename, port):
f.write("listener %d\n" % (port))
f.write("allow_anonymous true\n")
def write_config6(filename, port):
with open(filename, 'w') as f:
f.write("allow_anonymous false\n")
def write_config7(filename, port):
with open(filename, 'w') as f:
f.write("allow_anonymous true\n")
def do_test(use_conf, write_config, expect_success):
port = mosq_test.get_port()
@ -61,6 +69,7 @@ def do_test(use_conf, write_config, expect_success):
finally:
if write_config is not None:
os.remove(conf_file)
pass
broker.terminate()
broker.wait()
(stdo, stde) = broker.communicate()
@ -74,8 +83,7 @@ def do_test(use_conf, write_config, expect_success):
do_test(use_conf=False, write_config=None, expect_success=True)
# Config file but no listener - allow_anonymous should be true
# Not possible right now because the test doesn't allow us to use a config file and -p at the same time.
#do_test(use_conf=True, write_config=write_config1, expect_success=True)
do_test(use_conf=True, write_config=write_config1, expect_success=True)
# Config file with "port" - allow_anonymous should be false
do_test(use_conf=True, write_config=write_config2, expect_success=False)
@ -88,4 +96,10 @@ do_test(use_conf=True, write_config=write_config4, expect_success=True)
# Config file with "listener" - allow_anonymous explicitly true
do_test(use_conf=True, write_config=write_config5, expect_success=True)
# Config file without "listener" - allow_anonymous explicitly false
do_test(use_conf=True, write_config=write_config6, expect_success=False)
# Config file without "listener" - allow_anonymous explicitly true
do_test(use_conf=True, write_config=write_config7, expect_success=True)
exit(0)

View File

@ -17,6 +17,9 @@ def write_config(filename, port1, port2, protocol_version):
f.write("topic +/value in 0 local3/topic/ remote3/topic/\n")
f.write("topic ic/+ in 0 local4/top remote4/tip\n")
f.write("topic clients/total in 0 test/mosquitto/org $SYS/broker/\n")
f.write('topic rmapped in 0 "" remote/mapped/\n')
f.write('topic lmapped in 0 local/mapped/ ""\n')
f.write('topic "" in 0 local/single remote/single\n')
f.write("notifications false\n")
f.write("restart_timeout 5\n")
f.write("bridge_protocol_version %s\n" % (protocol_version))
@ -70,6 +73,9 @@ def inner_test(bridge, sock, proto_ver):
('local3/topic/something/value', 'remote3/topic/something/value'),
('local4/topic/something', 'remote4/tipic/something'),
('test/mosquitto/orgclients/total', '$SYS/broker/clients/total'),
('local/mapped/lmapped', 'lmapped'),
('rmapped', 'remote/mapped/rmapped'),
('local/single', 'remote/single'),
]
for (local_topic, remote_topic) in cases:

View File

@ -75,8 +75,11 @@ def do_test(proto_ver):
bridge.send(bytes.fromhex("320c00062b2b2b2b2b2b00040033"))
#bridge.send(bytes.fromhex("320c00062b2b2b2b2b2b00040033"))
#bridge.send(bytes.fromhex("320c00062b2b2b2b2b2b00040033"))
mosq_test.do_ping(bridge)
except ConnectionResetError:
bridge.send(bytes.fromhex("C000")) # PING
d = bridge.recv(1)
if len(d) == 0:
rc = 0
except (ConnectionResetError, BrokenPipeError, mosq_test.TestError):
#expected behaviour
rc = 0

View File

@ -24,26 +24,33 @@ conf_file = os.path.basename(__file__).replace('.py', '.conf')
write_config(conf_file, port1, port2)
rc = 1
keepalive = 10
connect_packet = mosq_test.gen_connect("connect-success-test", keepalive=keepalive)
connect_packet = mosq_test.gen_connect("connect-success-test")
broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port2, use_conf=True)
ssl_eof = False
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile="../ssl/test-root-ca.crt")
context.load_cert_chain(certfile="../ssl/client-expired.crt", keyfile="../ssl/client-expired.key")
ssock = context.wrap_socket(sock, server_hostname="localhost")
ssock.settimeout(20)
try:
ssock.connect(("localhost", port1))
mosq_test.do_send_receive(ssock, connect_packet, "", "connack")
except ssl.SSLError as err:
if err.errno == 1:
rc = 0
else:
broker.terminate()
raise ValueError(err.errno)
with socket.create_connection(("localhost", port1)) as sock:
ssock = context.wrap_socket(sock, server_hostname="localhost", suppress_ragged_eofs=True)
ssock.settimeout(None)
try:
mosq_test.do_send_receive(ssock, connect_packet, "", "connack")
except ssl.SSLEOFError:
# Under load, sometimes the broker closes the connection after the
# handshake has failed, but before we have chance to send our
# payload and so we get an EOF.
ssl_eof = True
except ssl.SSLError as err:
if err.reason == "SSLV3_ALERT_CERTIFICATE_EXPIRED":
rc = 0
elif err.errno == 8 and "EOF occurred" in err.strerror:
rc = 0
else:
broker.terminate()
print(err.strerror)
raise ValueError(err.errno) from err
except mosq_test.TestError:
pass
finally:
@ -52,8 +59,11 @@ finally:
broker.terminate()
broker.wait()
(stdo, stde) = broker.communicate()
if ssl_eof:
if "certificate verify failed" in stde.decode('utf-8'):
rc = 0
if rc:
print(stde.decode('utf-8'))
exit(rc)

View File

@ -28,6 +28,7 @@ connect_packet = mosq_test.gen_connect("connect-revoked-test", keepalive=keepali
broker = mosq_test.start_broker(filename=os.path.basename(__file__), port=port2, use_conf=True)
ssl_eof = False
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafile="../ssl/test-root-ca.crt")
@ -36,7 +37,22 @@ try:
ssock.settimeout(20)
try:
ssock.connect(("localhost", port1))
mosq_test.do_send_receive(ssock, connect_packet, "", "connack")
try:
mosq_test.do_send_receive(ssock, connect_packet, "", "connack")
except ssl.SSLEOFError:
# Under load, sometimes the broker closes the connection after the
# handshake has failed, but before we have chance to send our
# payload and so we get an EOF.
ssl_eof = True
except ssl.SSLError as err:
if err.reason == "SSLV3_ALERT_CERTIFICATE_REVOKED":
rc = 0
elif err.errno == 8 and "EOF occurred" in err.strerror:
rc = 0
else:
broker.terminate()
print(err.strerror)
raise ValueError(err.errno) from err
except ssl.SSLError as err:
if err.errno == 1 and "certificate revoked" in err.strerror:
rc = 0
@ -53,6 +69,9 @@ finally:
broker.terminate()
broker.wait()
(stdo, stde) = broker.communicate()
if ssl_eof:
if "certificate verify failed" in stde.decode('utf-8'):
rc = 0
if rc:
print(stde.decode('utf-8'))

View File

@ -12,7 +12,8 @@
{ "name": "01", "ver":4, "msgs": [{"type":"send", "payload":"01 00"}]},
{ "name": "02", "ver":4, "msgs": [{"type":"send", "payload":"02 00"}]},
{ "name": "04", "ver":4, "msgs": [{"type":"send", "payload":"04 00"}]},
{ "name": "08", "ver":4, "msgs": [{"type":"send", "payload":"08 00"}]}
{ "name": "08", "ver":4, "msgs": [{"type":"send", "payload":"08 00"}]},
{ "name": "0A with illegal length C0", "ver":4, "expect_disconnect":true, "msgs": [{"type":"send", "payload":"0A C0"}]}
]
},
{
@ -46,7 +47,11 @@
{ "name": "08", "ver":5, "msgs": [
{"type":"send", "payload":"08 00"},
{"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"}
]}
]},
{ "name": "0A with illegal length C0", "ver":5, "expect_disconnect":true, "msgs": [
{"type":"send", "payload":"0A C0"},
{"type":"recv", "payload":"E0 01 82", "comment":"DISCONNECT protocol error"}
]}
]
}
]

View File

@ -41,7 +41,15 @@
{ "name": "30 topic with U+FFFF", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 746FEDBFBF 7061796C6F6164"}]},
{ "name": "30 topic with U+2A6D4 (section 1.5.3.1)", "ver":4, "expect_disconnect":false, "msgs": [{"type":"send", "payload":"30 0E 0005 41F0AA9B94 7061796C6F6164"}]},
{ "name": "30 topic with + [MQTT-3.3.2-2]", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 2B6F706963 7061796C6F6164"}]},
{ "name": "30 topic with # [MQTT-3.3.2-2]", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 236F706963 7061796C6F6164"}]}
{ "name": "30 topic with # [MQTT-3.3.2-2]", "ver":4, "msgs": [{"type":"send", "payload":"30 0E 0005 236F706963 7061796C6F6164"}]},
{ "name": "34 QoS 2 repeated with/without payload", "ver":4, "expect_disconnect":false, "msgs": [
{"type":"send", "payload":"34 09 0005 746F706963 1234"},
{"type":"recv", "payload":"50 02 1234"},
{"type":"send", "payload":"34 0A 0005 746F706963 1234 70"},
{"type":"recv", "payload":"50 02 1234"},
{"type":"send", "payload":"34 09 0005 746F706963 1234"},
{"type":"recv", "payload":"50 02 1234"}
]}
]
},
{

View File

@ -17,3 +17,5 @@ Numbering is as follows:
10: Listener tests
11: Persistence tests
12: Property tests
13: Malformed tests
14: Dynamic security tests

View File

@ -30,6 +30,8 @@ def start_broker(filename, cmd=None, port=0, use_conf=False, expect_fail=False,
if port == 0:
port = 1888
else:
cmd += ['-p', str(port)]
else:
if cmd is None and port != 0:
cmd = ['../../src/mosquitto', '-v', '-p', str(port)]

View File

@ -5,100 +5,100 @@ Certificate:
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=GB, ST=Derbyshire, L=Derby, O=Mosquitto Project, OU=Testing, CN=Root CA
Validity
Not Before: Jan 15 05:59:52 2025 GMT
Not After : Jan 14 05:59:52 2030 GMT
Not Before: Feb 25 13:42:36 2025 GMT
Not After : Feb 24 13:42:36 2030 GMT
Subject: C=GB, ST=Derbyshire, O=Mosquitto Project, OU=Testing, CN=Signing CA
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:da:66:c6:f0:fb:48:ef:2f:a7:df:22:2a:db:cc:
8c:18:0d:99:18:b9:55:71:c0:90:0e:5a:c6:06:54:
d9:f2:ce:d5:55:05:52:be:b2:25:57:17:fc:35:03:
e8:0a:11:87:29:f0:47:e6:a7:4d:e4:b6:03:4a:e0:
37:be:de:e4:80:a4:c9:54:07:d4:84:7d:81:e2:fd:
50:77:ec:b1:e1:15:a6:24:bf:9a:76:63:cd:99:00:
dd:8b:42:0e:3b:92:7d:74:d4:35:12:79:15:07:c2:
19:e5:fc:dc:64:74:bd:dd:71:56:98:d9:4e:65:d8:
5c:86:43:e6:35:02:88:0e:a2:b0:e6:f8:2b:84:88:
68:28:7f:a3:71:4a:ef:4f:a6:3f:2f:58:e2:c8:86:
2e:07:bc:6a:3d:14:3e:ca:dc:6d:1b:6f:86:61:5b:
c0:bf:da:c9:45:1e:1a:a8:19:a1:66:9b:f8:4d:a2:
23:77:ea:8a:ef:5d:0e:6a:71:f8:26:5e:0a:e1:2d:
2b:1a:e8:4b:19:e2:65:7b:e8:eb:69:40:c4:e8:ea:
31:d2:54:24:c0:a8:d5:1e:e7:c9:0f:2b:a2:69:9f:
38:3c:02:37:a0:f2:ca:01:51:cf:1c:b5:21:0b:2a:
5c:c4:93:bb:ac:59:ff:7e:67:c6:a1:e0:84:cd:a0:
e6:ad
00:fc:78:66:8a:f8:af:87:3b:96:62:ea:85:fd:51:
f9:0f:e4:a6:c2:3d:2d:0d:f6:a2:ff:32:2c:b4:d9:
31:4c:fa:e9:31:87:62:12:c1:67:99:1d:96:65:d6:
70:cf:2e:b3:7f:fc:d6:90:8d:9f:eb:e6:a7:a3:4f:
07:ab:be:90:37:6e:ee:26:47:e5:0f:0f:a2:41:56:
2d:ff:45:45:87:7a:c4:90:f3:c6:73:af:83:a5:40:
56:fe:24:28:71:c1:a3:03:74:7a:ce:2a:14:af:89:
47:7c:0c:c3:ec:36:e3:ee:95:bd:0e:da:23:2b:52:
b4:c9:c1:84:eb:62:84:95:de:76:f3:be:68:dc:bd:
82:73:b0:e5:08:51:6d:3e:97:4a:5d:b8:3d:05:ea:
da:ae:d3:d9:a4:58:f9:ef:c9:57:52:f5:38:1c:27:
67:70:8d:4e:b2:46:c0:12:fe:b9:7d:1e:79:6c:d3:
c7:36:e2:e1:ce:35:8b:89:61:0f:35:ef:c1:76:3f:
c0:0f:e9:10:27:5a:71:ca:63:2b:6e:19:66:aa:74:
df:a0:1c:5a:73:e1:0b:ca:6e:67:09:fa:e2:0a:b4:
29:63:b0:3b:7d:2f:82:b3:10:56:d9:1b:a1:77:60:
2b:d7:8d:05:40:20:88:71:98:91:18:e4:ce:af:07:
4b:a5
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
53:48:5A:50:4D:78:80:6D:55:79:8A:FE:A9:A3:68:7A:04:9A:F0:87
32:41:09:D3:64:22:D3:E9:E0:07:DA:E3:D5:56:C8:44:61:46:DC:38
X509v3 Authority Key Identifier:
0F:B8:7D:2E:0F:7C:9E:AA:4F:C6:6B:2B:AE:90:CF:CE:E8:2C:45:CC
X509v3 Basic Constraints: critical
A8:C7:9F:BC:59:76:70:BA:3E:11:6D:54:51:E3:25:CC:83:96:C9:B4
X509v3 Basic Constraints:
CA:TRUE
X509v3 Key Usage:
Certificate Sign, CRL Sign
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
35:7d:11:3c:db:4d:b5:63:d3:c0:6d:61:fa:6c:e5:43:15:aa:
c6:c4:f7:20:5b:78:aa:95:b7:e4:cf:89:ca:c8:17:10:d0:f0:
69:12:96:e4:f3:c5:58:ab:aa:e0:be:eb:5d:37:43:af:9e:3a:
6f:f9:ef:cf:6f:f5:67:25:62:e4:70:8e:08:9a:fc:17:32:45:
b5:f1:c8:6c:ad:e8:4c:2f:14:67:24:e0:24:b6:84:22:34:26:
8b:6d:ff:e1:5c:9d:c2:84:18:d7:9d:48:ad:a0:0b:9c:ed:cd:
9e:d4:a8:20:7a:41:ea:c3:00:a3:3b:a5:ab:22:ad:41:45:5a:
17:5f:e2:1a:8c:9f:ab:be:bc:7b:3d:a4:23:93:db:80:2c:1b:
9b:50:cf:72:b9:ef:f5:54:76:63:47:a0:73:bd:57:37:51:47:
e6:0e:f6:b2:81:70:11:db:88:44:6d:82:96:6f:85:6d:67:25:
1b:67:b3:ad:3c:59:17:96:6a:c0:9f:f4:d4:8a:5a:ee:81:8d:
8f:18:2c:92:9c:ab:26:40:36:21:ba:1b:db:13:65:34:dd:bf:
26:ad:12:1f:aa:97:55:c5:d4:60:e5:9e:75:37:3d:3c:3b:b2:
b0:97:15:6a:a9:1e:66:bf:a4:64:82:6b:8e:60:f4:26:a0:5c:
81:f1:f4:64
4e:38:ce:97:e9:c4:d8:65:6a:d9:b0:57:6b:93:3d:0f:ef:fa:
3d:ca:e1:33:c3:2f:5b:2b:2b:fe:f6:62:af:66:33:6f:f7:e4:
0b:1d:c9:ef:fb:01:b0:8c:43:2f:f3:68:b4:f9:f9:10:e0:0b:
bc:f4:a2:c5:8c:95:45:e4:73:38:e7:3c:56:4a:2a:70:a5:3a:
1f:ce:30:15:2f:06:ec:98:5e:9d:54:fb:9d:c8:d1:1e:55:94:
06:9c:fd:40:6f:95:2a:8d:48:c5:9e:2c:15:49:f4:9a:dd:1f:
14:02:7c:7d:3e:9e:71:f5:0d:80:22:e1:83:80:3f:23:0f:47:
3f:ef:ad:73:bc:e3:83:5d:87:a4:b7:78:86:51:ac:66:66:d4:
4e:3a:d7:24:1d:3d:61:ff:99:02:62:3f:3f:79:7a:3a:30:cb:
78:84:3e:63:bd:6d:55:49:4b:34:c4:92:16:9f:c2:4c:20:a1:
81:52:73:ab:7a:46:40:6c:ea:0a:bd:7e:fa:01:1c:3c:2e:fa:
21:95:80:ac:3b:a7:98:c0:7a:33:64:1b:39:c1:bb:a8:d6:45:
1a:f0:62:2f:f8:99:dc:dc:02:d7:bd:fe:b7:28:5d:05:60:68:
47:ac:99:1f:ea:8f:01:5a:81:20:3d:52:15:3b:d7:43:bf:c8:
78:68:8c:9a
-----BEGIN CERTIFICATE-----
MIIDsjCCApqgAwIBAgIBATANBgkqhkiG9w0BAQsFADByMQswCQYDVQQGEwJHQjET
MBEGA1UECAwKRGVyYnlzaGlyZTEOMAwGA1UEBwwFRGVyYnkxGjAYBgNVBAoMEU1v
c3F1aXR0byBQcm9qZWN0MRAwDgYDVQQLDAdUZXN0aW5nMRAwDgYDVQQDDAdSb290
IENBMB4XDTI1MDExNTA1NTk1MloXDTMwMDExNDA1NTk1MlowZTELMAkGA1UEBhMC
IENBMB4XDTI1MDIyNTEzNDIzNloXDTMwMDIyNDEzNDIzNlowZTELMAkGA1UEBhMC
R0IxEzARBgNVBAgMCkRlcmJ5c2hpcmUxGjAYBgNVBAoMEU1vc3F1aXR0byBQcm9q
ZWN0MRAwDgYDVQQLDAdUZXN0aW5nMRMwEQYDVQQDDApTaWduaW5nIENBMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2mbG8PtI7y+n3yIq28yMGA2ZGLlV
ccCQDlrGBlTZ8s7VVQVSvrIlVxf8NQPoChGHKfBH5qdN5LYDSuA3vt7kgKTJVAfU
hH2B4v1Qd+yx4RWmJL+admPNmQDdi0IOO5J9dNQ1EnkVB8IZ5fzcZHS93XFWmNlO
ZdhchkPmNQKIDqKw5vgrhIhoKH+jcUrvT6Y/L1jiyIYuB7xqPRQ+ytxtG2+GYVvA
v9rJRR4aqBmhZpv4TaIjd+qK710OanH4Jl4K4S0rGuhLGeJle+jraUDE6Oox0lQk
wKjVHufJDyuiaZ84PAI3oPLKAVHPHLUhCypcxJO7rFn/fmfGoeCEzaDmrQIDAQAB
o2AwXjAdBgNVHQ4EFgQUU0haUE14gG1VeYr+qaNoegSa8IcwHwYDVR0jBBgwFoAU
D7h9Lg98nqpPxmsrrpDPzugsRcwwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC
AQYwDQYJKoZIhvcNAQELBQADggEBADV9ETzbTbVj08BtYfps5UMVqsbE9yBbeKqV
t+TPicrIFxDQ8GkSluTzxVirquC+6103Q6+eOm/5789v9WclYuRwjgia/BcyRbXx
yGyt6EwvFGck4CS2hCI0Jott/+FcncKEGNedSK2gC5ztzZ7UqCB6QerDAKM7pasi
rUFFWhdf4hqMn6u+vHs9pCOT24AsG5tQz3K57/VUdmNHoHO9VzdRR+YO9rKBcBHb
iERtgpZvhW1nJRtns608WReWasCf9NSKWu6BjY8YLJKcqyZANiG6G9sTZTTdvyat
Eh+ql1XF1GDlnnU3PTw7srCXFWqpHma/pGSCa45g9CagXIHx9GQ=
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/HhmivivhzuWYuqF/VH5D+Smwj0t
Dfai/zIstNkxTPrpMYdiEsFnmR2WZdZwzy6zf/zWkI2f6+ano08Hq76QN27uJkfl
Dw+iQVYt/0VFh3rEkPPGc6+DpUBW/iQoccGjA3R6zioUr4lHfAzD7Dbj7pW9Dtoj
K1K0ycGE62KEld52875o3L2Cc7DlCFFtPpdKXbg9BerartPZpFj578lXUvU4HCdn
cI1OskbAEv65fR55bNPHNuLhzjWLiWEPNe/Bdj/AD+kQJ1pxymMrbhlmqnTfoBxa
c+ELym5nCfriCrQpY7A7fS+CsxBW2Ruhd2Ar140FQCCIcZiRGOTOrwdLpQIDAQAB
o1AwTjAdBgNVHQ4EFgQUMkEJ02Qi0+ngB9rj1VbIRGFG3DgwHwYDVR0jBBgwFoAU
qMefvFl2cLo+EW1UUeMlzIOWybQwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsF
AAOCAQEATjjOl+nE2GVq2bBXa5M9D+/6PcrhM8MvWysr/vZir2Yzb/fkCx3J7/sB
sIxDL/NotPn5EOALvPSixYyVReRzOOc8VkoqcKU6H84wFS8G7JhenVT7ncjRHlWU
Bpz9QG+VKo1IxZ4sFUn0mt0fFAJ8fT6ecfUNgCLhg4A/Iw9HP++tc7zjg12HpLd4
hlGsZmbUTjrXJB09Yf+ZAmI/P3l6OjDLeIQ+Y71tVUlLNMSSFp/CTCChgVJzq3pG
QGzqCr1++gEcPC76IZWArDunmMB6M2QbOcG7qNZFGvBiL/iZ3NwC173+tyhdBWBo
R6yZH+qPAVqBID1SFTvXQ7/IeGiMmg==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIID0jCCArqgAwIBAgIUW8+lC7lrC3H9c9s3xSbY7PqwZ0YwDQYJKoZIhvcNAQEL
MIIDwjCCAqqgAwIBAgIUDiOgy2+OZHYt79OQYMRk66SIxq8wDQYJKoZIhvcNAQEL
BQAwcjELMAkGA1UEBhMCR0IxEzARBgNVBAgMCkRlcmJ5c2hpcmUxDjAMBgNVBAcM
BURlcmJ5MRowGAYDVQQKDBFNb3NxdWl0dG8gUHJvamVjdDEQMA4GA1UECwwHVGVz
dGluZzEQMA4GA1UEAwwHUm9vdCBDQTAeFw0yNTAxMTUwNTU5NTFaFw0zNTAxMTMw
NTU5NTFaMHIxCzAJBgNVBAYTAkdCMRMwEQYDVQQIDApEZXJieXNoaXJlMQ4wDAYD
dGluZzEQMA4GA1UEAwwHUm9vdCBDQTAeFw0yNTAyMjUxMzQyMzZaFw0zNTAyMjMx
MzQyMzZaMHIxCzAJBgNVBAYTAkdCMRMwEQYDVQQIDApEZXJieXNoaXJlMQ4wDAYD
VQQHDAVEZXJieTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3QxEDAOBgNVBAsM
B1Rlc3RpbmcxEDAOBgNVBAMMB1Jvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB
DwAwggEKAoIBAQDAK2HNO04pSn4OD45IA2nph6j9iiS5fg7ppJKV67dUvXFDjf/h
OKmP2dOgF2TyD0erKKB7MdCHJxEmt6yT873Js4Sdo6RioApUtcAzdlO7e7EYR8Y2
HMh5dlwniOoRDeIHUeCcSdn+t+751vBusGbQVEFGJdmW9eo+gkNYa4C48kxF/ntL
drDNIUPL/WZmjE6lqeF4n5ShrRenkPduZ2Z+YOua6eKY22q5PaoULN6kSUcDw3iP
3j7WHt2yvf+Wl6G5Xb0gf+btEoX/FR5wwj0blbT3eSbjqqxuwp7M6v7TYPeptVfI
1PSd2e6AS5MPjOpe3PccCnUQFVhgZ/YQksz5AgMBAAGjYDBeMB0GA1UdDgQWBBQP
uH0uD3yeqk/GayuukM/O6CxFzDAfBgNVHSMEGDAWgBQPuH0uD3yeqk/GayuukM/O
6CxFzDAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsF
AAOCAQEAHoScGN8Wpx3D6N5tZLzJ+3b5bbuUv+RYdcMvbQpfDtbpoqolPCHDa0AZ
vwkYL/X9VUIiyi9RoTz3jARqL8+cJPF9FwBtuEZcrrs4doLR4uFHpDFY/qFxsa3W
e7WOiUTRQUi4jzVoUqomJJ0tyAEBLea4Wjnr8v20ao56NC1bZk3jU4yn22NTlpS/
gDFdSc0D1+VxgaOwZBPPT8yGcPe1JfyPzTII4m5B3LhTjOljtt4DygXEPC8D6yA/
KPOiXBTSGRa2sqXVt2lHqKFloPMlipI6+raG40m9iILrmEfVWa7vr0n/oChPGYGD
hTtA/VDL/ziC40s7Mv0kyDIZhV+TlA==
DwAwggEKAoIBAQCWyHR/VLT7MC15Sg4tbkSn76iaEk7uLLH1TeoPmIvx9gOdRTOl
4dpmgHbHnxDTGJKN7s3AP2JabDlW2po9g5p8rQW4udFKU3AdA2WANEwxxiDOr4+P
R/NigojbuCjyYQq/mJVRfA9+dsusESSbPhdKCXim6RzW9kZv1iXtqcvSSdSCEqnm
t1ggM25FlayWKpdK4pxoNG6YHidPuXhTGGIzPAoAgYTKLwtE2r/skJaWOZDcaRuE
2IWcnVc1oA0QUF1cLGuzr0McoLenRGJY9FwJW/lRD2rptuTuhHt49Lp1ktssMYPS
kgPNGUzKSjl1UuT8vIos707D6hjLWBGZ2TcRAgMBAAGjUDBOMB0GA1UdDgQWBBSo
x5+8WXZwuj4RbVRR4yXMg5bJtDAfBgNVHSMEGDAWgBSox5+8WXZwuj4RbVRR4yXM
g5bJtDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCOU45Xzsv4KM2w
IZ8Zs5V0O9ymJFoNprsZNOSsHocYO++HvgNBeNttckj/SYUCrmjjgrl2FLfjylBR
LY8viHltUFvYSJbALaitOLeeyO/wxaOEHBCNoaXaUStBmkOEE47QdAbj12hvZNWT
i7oO4eGxHYLTcAx5ZB2yrmBtxtoPbLDAjv8WrjbCd+Ph47SVTj4bl3OOJd+EUgew
8KDkiujFA+iz/yXiE144uDKI+TXvjVacewJnimbtjhRvBbUXs7TkPLWZlgszM+M/
/WudYPsCapM6fYb01Nvn8dLRRsIpqNUo/jghs96ss6c7MjBdToLCoM/SRzDiRWSH
uxQtAfaZ
-----END CERTIFICATE-----

View File

@ -5,31 +5,31 @@ Certificate:
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=GB, ST=Derbyshire, O=Mosquitto Project, OU=Testing, CN=Signing CA
Validity
Not Before: Jan 15 05:59:52 2025 GMT
Not After : Jan 14 05:59:52 2030 GMT
Not Before: Feb 25 13:42:37 2025 GMT
Not After : Feb 24 13:42:37 2030 GMT
Subject: C=GB, ST=Nottinghamshire, L=Nottingham, O=Server, OU=Production, CN=test client encrypted
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:b8:a9:b5:94:9f:46:0d:0c:ad:0e:73:c9:18:bc:
27:dc:67:6d:c9:02:b7:e2:0a:1b:31:c3:48:a7:5c:
d3:ae:69:b5:f5:ce:f3:53:33:13:a1:59:ff:da:30:
0e:42:1d:14:e3:f5:55:e3:62:ee:82:bf:03:ab:71:
f4:ac:fa:99:56:fc:e5:65:e0:bd:c7:5b:54:b0:46:
01:ee:2a:fc:c2:ab:82:c4:6b:3f:2f:3a:d7:11:90:
2e:0b:a7:29:aa:01:ee:d8:b0:5b:de:65:9b:c1:d2:
35:83:ce:b8:f8:57:a6:63:b3:6d:dd:1d:59:88:84:
34:cf:c4:4c:b9:cd:82:08:91:4b:7d:20:c1:b0:8a:
98:af:87:fb:15:8d:32:f9:e6:15:50:b8:f2:df:11:
66:16:c5:c5:9e:73:70:28:68:ee:b5:58:d4:8b:07:
6a:f2:e8:4b:08:98:38:71:44:7c:4e:9f:90:94:af:
4b:82:8b:eb:a3:c8:90:0b:ae:cb:cd:4b:92:55:67:
c5:ec:15:a3:f3:7b:64:cb:9c:8f:6d:13:b3:99:b8:
81:2a:fb:b2:ae:67:97:a9:6e:33:f3:cd:ca:ad:84:
26:f1:42:ad:78:ea:bb:f0:ee:49:f1:7e:2b:7d:66:
59:73:33:fb:9b:30:80:e8:15:22:9a:35:96:bf:05:
83:25
00:c5:77:41:1d:66:05:4f:97:66:74:8b:ea:77:b6:
ee:1a:64:4c:b7:bf:48:7f:6f:3b:a8:b8:49:71:41:
60:c6:08:72:42:ed:17:31:12:11:08:6d:56:35:56:
6d:8a:6a:b3:5e:28:94:55:ea:8d:48:aa:e3:3f:fb:
ad:48:4b:08:84:6b:ba:da:5a:29:de:82:5f:7e:33:
6a:83:c9:25:04:a8:5b:1d:65:9f:f6:d2:30:1a:69:
39:39:cd:98:22:3c:ee:1d:01:0f:30:00:27:26:d1:
6f:fa:0d:6e:65:65:c5:18:0f:54:96:85:8c:73:08:
e6:23:70:0a:07:1a:57:ac:bc:70:07:ac:67:14:91:
69:eb:e4:15:c2:1d:4a:07:3e:83:c6:18:5b:e4:74:
f1:19:9d:e2:d5:bc:7f:a1:31:c0:aa:9d:03:52:16:
1f:aa:30:7f:e2:f0:1e:b5:08:0c:66:5c:13:00:89:
00:e6:4e:63:f4:97:35:32:cd:93:b2:6c:aa:b2:ec:
bd:ef:c4:cb:bd:22:2f:0b:3a:c9:91:31:9b:8a:0d:
e9:c6:4a:42:3d:89:14:38:71:f3:68:9e:d1:ef:67:
a2:9f:aa:77:5b:a1:a7:44:0c:c3:fc:da:e1:8d:f0:
84:7f:f5:02:f0:17:bd:57:f3:97:a6:c3:ca:46:7d:
37:b1
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
@ -37,46 +37,46 @@ Certificate:
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
77:81:C8:19:9C:C0:B2:F5:4B:90:F2:89:61:73:A6:50:A1:52:8F:C5
EF:FF:62:D5:1A:6D:F3:F4:BE:88:D5:4B:00:93:10:42:56:98:B5:EF
X509v3 Authority Key Identifier:
53:48:5A:50:4D:78:80:6D:55:79:8A:FE:A9:A3:68:7A:04:9A:F0:87
32:41:09:D3:64:22:D3:E9:E0:07:DA:E3:D5:56:C8:44:61:46:DC:38
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
12:37:82:5f:6a:5e:71:66:b1:c4:78:4c:15:72:b6:69:30:f8:
c7:a2:51:ba:9f:2c:ea:46:9b:ff:4c:cc:2c:62:a4:12:fb:d8:
b1:06:16:39:73:de:ea:13:2e:04:51:33:22:07:75:21:8d:7b:
7a:89:db:40:3e:28:73:22:79:8f:12:3d:30:7c:40:15:8f:52:
e6:e0:9f:10:e6:ab:09:5c:b8:31:b7:c8:d5:b6:b3:8b:1d:e8:
e9:3c:0b:d4:b9:38:62:a9:89:c3:64:d0:b8:74:3a:80:4d:ec:
75:6d:8d:c5:06:b4:b4:64:86:3e:06:ae:68:0d:be:73:46:e9:
9b:1b:ab:bc:ae:b9:8d:a2:d1:cd:2f:d0:66:8a:0c:b5:d1:c1:
6f:c0:c3:cc:60:83:91:ba:6a:70:ab:e6:ad:7c:43:38:d4:53:
d3:3f:20:b5:cb:a3:61:b3:2b:39:16:d1:14:59:fc:86:38:af:
b0:e6:25:14:0d:ca:81:cf:36:d8:5d:4c:36:65:22:41:ec:38:
fc:e1:a8:b3:ad:9a:d6:91:3a:2b:22:a0:bb:1b:aa:07:c0:64:
52:67:5c:9c:ca:44:57:b3:02:54:26:1f:a4:30:5c:6a:be:2d:
18:e8:77:5c:eb:d0:4e:fc:07:24:f4:ce:47:70:4b:8d:ef:52:
23:36:e3:eb
5c:89:f3:48:b0:74:ac:ed:ac:73:26:ed:72:11:bf:43:74:c6:
6d:4b:6f:95:aa:9d:68:a3:ef:b0:8c:85:2f:b8:5d:d6:b7:1b:
e5:ee:33:02:5f:80:5d:ff:6d:4a:df:39:2f:4b:9e:40:36:6e:
57:c6:07:fe:7f:3c:1d:fd:d6:9d:f0:e0:d6:0b:df:94:15:c0:
e5:fa:2e:b6:0f:58:b1:6e:8b:d1:4f:c3:6d:10:05:24:ec:af:
d9:af:d2:1a:b9:61:5a:fd:c6:a9:cd:84:68:5c:25:c2:5d:c0:
73:cc:e9:d9:2c:97:ff:9f:33:56:d6:21:87:65:1d:cf:35:7b:
c5:a8:60:47:6a:ee:d7:f6:8f:b2:d5:7d:91:d1:1d:b9:c3:55:
2f:f0:e9:50:3d:8a:9b:9b:7b:e0:3b:85:80:ab:db:d0:1a:ac:
15:1e:4c:87:2d:89:fb:4d:e9:e5:f8:3a:fa:dd:84:61:0c:20:
78:20:c8:58:f7:59:be:4f:b9:fd:2e:6d:5c:3a:ce:b1:85:cb:
0a:c8:e7:73:77:7f:25:30:3f:64:fa:9f:38:64:c4:d1:84:9c:
99:9a:94:d0:2f:f0:40:a9:a1:db:6a:97:99:ab:c2:68:ee:6e:
79:e7:07:14:19:aa:76:2a:ae:46:36:89:cc:b2:a3:b9:ca:a0:
d3:e2:4e:76
-----BEGIN CERTIFICATE-----
MIID3jCCAsagAwIBAgIBBjANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjET
MBEGA1UECAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3Qx
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMTE1
MDU1OTUyWhcNMzAwMTE0MDU1OTUyWjCBgjELMAkGA1UEBhMCR0IxGDAWBgNVBAgM
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMjI1
MTM0MjM3WhcNMzAwMjI0MTM0MjM3WjCBgjELMAkGA1UEBhMCR0IxGDAWBgNVBAgM
D05vdHRpbmdoYW1zaGlyZTETMBEGA1UEBwwKTm90dGluZ2hhbTEPMA0GA1UECgwG
U2VydmVyMRMwEQYDVQQLDApQcm9kdWN0aW9uMR4wHAYDVQQDDBV0ZXN0IGNsaWVu
dCBlbmNyeXB0ZWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4qbWU
n0YNDK0Oc8kYvCfcZ23JArfiChsxw0inXNOuabX1zvNTMxOhWf/aMA5CHRTj9VXj
Yu6CvwOrcfSs+plW/OVl4L3HW1SwRgHuKvzCq4LEaz8vOtcRkC4LpymqAe7YsFve
ZZvB0jWDzrj4V6Zjs23dHVmIhDTPxEy5zYIIkUt9IMGwipivh/sVjTL55hVQuPLf
EWYWxcWec3AoaO61WNSLB2ry6EsImDhxRHxOn5CUr0uCi+ujyJALrsvNS5JVZ8Xs
FaPze2TLnI9tE7OZuIEq+7KuZ5epbjPzzcqthCbxQq146rvw7knxfit9ZllzM/ub
MIDoFSKaNZa/BYMlAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8W
HU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBR3gcgZnMCy
9UuQ8olhc6ZQoVKPxTAfBgNVHSMEGDAWgBRTSFpQTXiAbVV5iv6po2h6BJrwhzAN
BgkqhkiG9w0BAQsFAAOCAQEAEjeCX2pecWaxxHhMFXK2aTD4x6JRup8s6kab/0zM
LGKkEvvYsQYWOXPe6hMuBFEzIgd1IY17eonbQD4ocyJ5jxI9MHxAFY9S5uCfEOar
CVy4MbfI1bazix3o6TwL1Lk4YqmJw2TQuHQ6gE3sdW2NxQa0tGSGPgauaA2+c0bp
mxurvK65jaLRzS/QZooMtdHBb8DDzGCDkbpqcKvmrXxDONRT0z8gtcujYbMrORbR
FFn8hjivsOYlFA3Kgc822F1MNmUiQew4/OGos62a1pE6KyKguxuqB8BkUmdcnMpE
V7MCVCYfpDBcar4tGOh3XOvQTvwHJPTOR3BLje9SIzbj6w==
dCBlbmNyeXB0ZWQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDFd0Ed
ZgVPl2Z0i+p3tu4aZEy3v0h/bzuouElxQWDGCHJC7RcxEhEIbVY1Vm2KarNeKJRV
6o1IquM/+61ISwiEa7raWinegl9+M2qDySUEqFsdZZ/20jAaaTk5zZgiPO4dAQ8w
ACcm0W/6DW5lZcUYD1SWhYxzCOYjcAoHGlesvHAHrGcUkWnr5BXCHUoHPoPGGFvk
dPEZneLVvH+hMcCqnQNSFh+qMH/i8B61CAxmXBMAiQDmTmP0lzUyzZOybKqy7L3v
xMu9Ii8LOsmRMZuKDenGSkI9iRQ4cfNontHvZ6KfqndboadEDMP82uGN8IR/9QLw
F71X85emw8pGfTexAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8W
HU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTv/2LVGm3z
9L6I1UsAkxBCVpi17zAfBgNVHSMEGDAWgBQyQQnTZCLT6eAH2uPVVshEYUbcODAN
BgkqhkiG9w0BAQsFAAOCAQEAXInzSLB0rO2scybtchG/Q3TGbUtvlaqdaKPvsIyF
L7hd1rcb5e4zAl+AXf9tSt85L0ueQDZuV8YH/n88Hf3WnfDg1gvflBXA5foutg9Y
sW6L0U/DbRAFJOyv2a/SGrlhWv3Gqc2EaFwlwl3Ac8zp2SyX/58zVtYhh2UdzzV7
xahgR2ru1/aPstV9kdEducNVL/DpUD2Km5t74DuFgKvb0BqsFR5Mhy2J+03p5fg6
+t2EYQwgeCDIWPdZvk+5/S5tXDrOsYXLCsjnc3d/JTA/ZPqfOGTE0YScmZqU0C/w
QKmh22qXmavCaO5ueecHFBmqdiquRjaJzLKjucqg0+JOdg==
-----END CERTIFICATE-----

View File

@ -1,30 +1,30 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQ9EJo6ZUkUzZ4ehgD
P42UogICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIU1fju+xtrswEggTI
1l65S1uOhg5BVi/zebf0DjLhXTEGBgWUYtqRG7w/EN0uI0wWMK+iKna2BNa3TiZV
jiNkH3p5khQtrkH3LDpLP82ryN9P4/oDVCcYXf9pZjpIFfh8DSH4KfnJxRHGjTRA
MIio2a8caquy2vTdPMDF2uVofueuM50MTBc02LYQcC5zn5KPx/QbK8wK5Yv0C4um
3DCVH8EudU99CJ0ULy5MlJlYPS4NRbUWAbDj8c9Q97wGDSUJvjOebB7JMrATFhdH
C8WPbpmTA5mpetE9KxHc4x3OTkWm7BMKiaMxJUZQIcko0D+Motll4JQa7hMfZXIt
WiGcp0LKBPCmOD0wtl3pKSDKwUD0ZvT/N5Hjjsa3MueSEaWpbVSdnfV3RNPrBJpV
UlpxT35TIeiMrEPDyTlEV5G7OvX1tK2gJN63KvDxRFLLN25DYGYdu1+4uOzfEfdQ
KCA9auSfkzPjUoCaBOH399YWKQ+tvCPvmsfKvYBp6b3/hfecTpHvpDrDspUpZnsq
iUSuT52YBLO55mW7G4MedmcrCAZwnz6jjJZXVRUKNuyrWF3/4cBasknHOQM7gpgL
c7wwHoBdMx3tD0FZb/hLlToYIokuDQvk9Gobrx8rkxWi3SpRLdUo46MT7tqhKQPa
3QvTIbIHRBipiBKMdGUWCYVW6LBjoWEKF4fl6Rs8QO/PyNiq5R+SVlcx3PI305Nj
GvEj1+XaCR2snlfHDzM6EJ8LAwaWNJg1bxePa5h3ul+J4xsY+aZSTaE9WwvlmOMc
ygBECgDR0vZTKPPwQ/Gd82JfL63Q+efJVwR38Lfhgr7lgm+rr6Y71WTjACFDkF1A
A/pa1JrPh91E8FaLuMAJS+M8RCxgiYTpPSyCXvaO2iQANnTf3XyXuXA2g2xjbboc
UEMfvAXUUDnh5WxGJ2GBVaLby0g8/b9dLhkVDjrhb0nXzrUR+xzsZheafC9LXrP/
wzzAGB7Ftbggwoh5QxhIPYsN1sWCLadf+ZUZXRCT+Lnod480rzajru3wtK8BQuAX
dhWvH1nCpEkx6uYt9qiZK+n5Id4C2miFYPFYsKQtDqEYTICYoYL0ExniLtoX0Kc7
bBx1qOF60+M3WnhKPAPzRBTWEY3+MPzwaGhmCMiS/yVKghE+DDFMIAzaYwBMqHM8
TL92LWx1qR5k4NXgCKRyZR5SM0qcne//S2dmuB5VoZPVlc2hXWZFMIQ3LYPVYYHv
Dy74sZ/Q1yfFX9Z3d6sxEyCp1GUmxilWEg8fEn3195rsPJJMCaBx8DmASH8gyEY9
R8dF78Y/IwLVtzip2X+B3SVCzXF5Ziga91uSPvh375z0PSXHNSA/zhIfuNTwM7Nc
srP6TTqw4mxgBhlRZyxIdGqWJZhCTk3PMapaxwRPwskRfQSiUbaUZ4N4hVwock52
/2RID6MxKxfALhbiNeoWdqBpU6VYK5eGKZJugiVd7iOyPLZP8fr3BcONywKzdU8T
gvYWB4vMujeIUByWIN0Grevl92vkcUyQrijHwD29PjdTQjOhhzey54SOY4IRjxuq
Wkd5A4ZwzlVXpqKD6//JnG3OVo07qIUKUu1eXh9vcV45i1XdKr3Nxiu0gbE+qGq0
uWrGrDlP3IbAeHb51wTBWJPs+GqpGpzm
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIzZRUMtGhrGwCAggA
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECIACbIUZoRqwBIIEyP5H4S/aVseB
m4AiP2Mc/t2EGbfb4va/ZPIrii+iv5bLZLCFSIwesG5TRhljgoCCtwtsK4U8LsjW
l5boPWWXCKzwCU+yI74u6bk0z/3C0czHArHtxEbJNRn5OlCa9Dd6s8++whGsqbZe
ijykJIf66WZcy2VHGAUifdWNzMvD5NOpbHsQBjt0JY/g0/QiPUAAgoxZ4f52NIo1
mKeOsSuc5f+/TG3Gm2SVeG758TJE3bF21589Mec10jda5SGq/gIUvE2bhejCITDH
FEujdQLuFtz1Sfzqbi4UP89eUe0FIOh1sdmMwZLu4bphfMZI/muRWIRGvvTZQsMe
DOSk0tDuIAED5LkroElSDaRVgQPEckmqJoTNIagFh770Op0hwVLGoGsjW9ryf6wi
Pe8+zAuGrGnl9hWZx4feA3wfkmyrr2G2ipBzRnCfshElDVrZsz4gNJACKTbLldL7
OpML1tcrNK2PgsBmyPY0qO8H9RZJ+PDVn1vJ5d/j+Bd0z0zj5Z7knxEjwMtSllZw
RNuncXiS9/pysJwLs8JrnB+rrqpHk+ww3rxSlBLzhPcxZQKRSnoH7KxkxaBmVSXn
mzDH7xOG+0fF1ca2mC5WhlwJcI9y0qFROoOP+xcozQ/upMFNRwK2TVREO0bsc0Ql
/DAtWNi8iWPrEGX0tGLmw1PTZ58MHn/zylh8yd37kDMOEIBfyPywVtWYMpZWzmZ9
6oVIfgdTkuXZo0lOFLFZbwHdrGE+yJyusuriJAqtJ7IByxomc8BMNbWCuj0fYyxP
j6Odp9G/ujTBtVnaDiu60X6NMxzy1XYq2dh8nYdCdT/ucr+HAsURlKy+onRUDmGs
oAd+0OKm53aeLJj3c2F28Vrv1WWKJTRRpBQ21ZBiaIOiax4QxFy6ZVPFN6Jxqo/3
5LPWsLEnqXfqRGyk+CrRwsBgeJFWbZYgF74LpQsXG4oP0eeJfmeJTwrtSPxn9qHl
jP9u2haidOFntSaRQeD1NJRuUEMUi+mcyVj3zrCJLMg7Lv1wn5arwq+uSYzCz3zj
T4XGthYw7HN2ltP1hmdJ6tSc/AMESzjNlnJKa39s26WUkzvyriGl6JlgFBYoIZc+
nb1ChtMV1Gf2dlRHwLdH3yYS7N3e4FGpUDfimvD1s1gLP/6CdfpPBYS4I4B/p4Ea
Cv5N3OPZVgTjpjctfuOKpaaOTFDzOx2msnREeThfvKxNIHHjslsbBBXL7smge25O
gmUL8X8bhTuUI3cxW4hcMe7MkK4nuF4d2pkAGeGN5GepIGBdEZKFv2LKXTt2CBib
KE+cP40BjrMBeF/FEq57oP8o28zmksuoiJIPxGoPqUhUCgpA51AIA+wT7NIaJ09m
MYhfP6Kbqd4VjMiEJAlkHE0KChy/5qDzgIOBKkB8tEd3wSuOsJllnUqEYrr7oJlD
aQlacWnlFKBMDj/IulVYi5W1gJE+crY1Vc5srkkdneLiWcGMxM4m1PftW5AJ6oRQ
ruLpul3DmfH+VhPY9GNxauciO2G2llbL9clfJ6ujE7NfDaQPQAqgpjvaTZmha1Id
ijnem7zn0LsQuOpNBMR6c2Ij4pVBtCIlM58WYAvcbv1jlafJxO8MP7qp/YI8KwlE
kIHUz0xm+OAU8IURgB7y/g==
-----END ENCRYPTED PRIVATE KEY-----

View File

@ -12,24 +12,24 @@ Certificate:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:92:ef:7b:91:12:00:63:97:41:d1:95:22:9a:64:
06:78:7f:c2:71:15:f2:92:b1:32:9b:74:79:97:f4:
70:80:ba:42:2e:65:af:30:3d:5d:ea:ed:2b:da:7a:
f9:f1:8b:2d:04:24:de:10:70:8c:d5:d8:02:c3:5f:
b2:04:56:68:c6:56:f6:22:00:1d:5b:f3:59:28:9c:
57:72:ad:fe:44:49:4f:b9:86:76:c0:db:e7:43:d1:
fd:0b:28:ed:52:62:e7:95:5b:27:21:4c:57:c9:ec:
58:8e:fc:1c:af:8d:9e:1c:85:78:06:4b:93:12:63:
a7:97:5e:62:ad:61:ac:97:ad:68:b3:7f:7c:c2:a3:
e9:5d:7f:aa:2e:50:a4:f9:d2:96:28:e2:e9:92:03:
0b:b7:59:dd:63:4a:fc:00:94:b7:5c:d5:b2:fc:45:
00:34:b5:ca:cc:25:8c:6c:d2:dd:e5:a2:5e:e8:44:
16:fb:b9:e2:7f:09:cc:d2:44:2e:8f:3b:80:01:bc:
35:70:62:be:8d:b0:a4:73:61:d7:1c:da:98:c7:cc:
ab:cd:32:96:d2:2e:26:3e:f8:d3:85:3e:ce:55:16:
0d:1e:37:74:fa:d6:63:22:cd:73:e1:19:70:60:57:
f7:aa:67:4d:51:7a:87:51:44:cc:5d:b5:e7:18:91:
89:33
00:a0:6c:92:98:08:5f:a0:f9:ec:17:5b:3b:9c:77:
6c:d1:97:9b:5c:52:19:55:23:e0:5f:fd:3e:af:4c:
08:c0:42:44:a0:50:e0:78:19:4d:6a:09:b0:06:13:
6a:7e:93:c9:59:b2:49:f3:b3:1d:29:26:d2:19:0e:
c3:b1:99:29:6f:ed:60:c7:cf:98:3d:54:80:5b:bb:
9a:ec:e9:60:11:bc:99:e1:92:ab:d9:4a:f8:c5:01:
4b:bc:d8:6d:00:50:de:6e:88:6c:3d:07:c9:68:66:
2c:05:b5:f8:f2:79:3f:ea:b8:ea:8b:f7:80:10:14:
87:35:b3:8e:0e:41:3c:09:98:46:f6:08:51:21:11:
ea:8c:ed:a0:c0:a9:f6:a9:dc:27:13:52:a8:ff:4c:
43:39:a1:51:ce:bb:b5:5a:19:4f:b4:2e:12:06:d6:
06:0e:9b:1b:72:d3:f8:cd:25:c0:21:70:19:88:13:
66:b0:91:c8:83:cc:b4:0d:75:80:86:1c:ff:c6:71:
50:6f:12:d4:91:1d:33:1e:f4:df:ea:7c:b1:8e:13:
46:55:d8:d6:99:ce:0d:1e:90:9b:77:21:c8:9e:21:
4d:27:ef:de:60:66:44:12:8d:4c:ac:dd:d8:5d:52:
9b:57:34:92:50:5c:56:ff:5c:4c:74:88:3c:f8:e3:
76:33
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
@ -37,26 +37,26 @@ Certificate:
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
BD:E5:C3:D5:23:F1:66:3D:1A:57:4F:75:A3:12:C5:E9:AB:89:AF:CF
E7:E8:4C:32:22:16:87:05:09:F8:09:98:4A:D2:CA:B4:AA:B1:24:BA
X509v3 Authority Key Identifier:
53:48:5A:50:4D:78:80:6D:55:79:8A:FE:A9:A3:68:7A:04:9A:F0:87
32:41:09:D3:64:22:D3:E9:E0:07:DA:E3:D5:56:C8:44:61:46:DC:38
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
34:60:9b:10:34:53:20:12:46:0c:ec:ea:ce:4c:e7:fa:68:e9:
1c:88:27:b5:a0:be:36:d1:d5:e5:81:99:83:9d:48:8a:71:38:
7a:3d:13:96:2c:78:24:33:7f:f3:45:8d:e2:8c:d4:3b:17:94:
49:52:0f:20:ce:db:88:ba:91:f6:fe:34:18:f2:8a:08:84:4f:
15:2d:0e:3f:4a:d7:79:b9:d3:fe:bf:07:0f:01:1e:c4:03:1e:
36:b6:c4:d4:8e:fb:77:d9:51:44:69:c4:52:c4:92:ec:6b:76:
ed:d1:08:93:43:dc:de:88:4e:8f:cd:ab:6f:a8:44:53:00:5f:
bd:44:f3:e4:73:96:2b:f9:27:a5:18:27:bd:7e:ab:f6:ea:d9:
04:ca:3b:78:01:d9:26:e8:b9:a9:29:4e:bc:7a:78:68:a0:ad:
c4:1c:8a:df:15:4e:65:26:e2:ee:0d:3f:d7:ac:46:53:0c:a2:
9f:35:9c:54:03:78:07:68:e6:fd:3c:3f:20:c9:87:07:f6:d6:
37:ed:cb:f3:7b:23:6a:13:5d:28:83:91:cd:0e:cd:13:d3:99:
d6:1a:03:6a:a1:95:ac:1f:1c:e9:5e:a0:17:9f:4b:1d:c7:f8:
94:f6:30:86:6b:ba:54:d9:d9:93:81:65:61:70:b8:8f:0d:d2:
e9:25:f3:0f
79:d6:48:b2:17:75:25:f4:11:46:d2:b7:44:6a:c1:d6:19:6e:
5d:a2:dc:04:71:6a:61:7d:09:fd:cb:74:f2:b6:4d:0a:3c:72:
31:f4:28:00:2f:f9:da:6b:f5:a2:f1:65:df:04:f9:26:f7:17:
f4:ef:2e:da:eb:13:72:f6:5e:e1:a6:d1:90:46:7d:a6:81:c6:
5d:97:f3:11:cf:26:33:5b:4b:84:36:59:1b:5b:f1:76:27:bd:
24:db:3a:cb:55:44:c9:d4:61:52:33:cd:f3:27:2e:00:da:c3:
7b:00:06:b0:25:4f:c7:5c:d7:9f:d3:bb:6f:d0:c9:ba:1d:7e:
f4:27:ab:e6:18:f7:5e:32:ba:05:2c:8d:df:59:7e:5b:25:c4:
f7:8f:49:ec:d6:16:2d:13:30:57:6d:3f:1a:ed:a4:c4:11:f9:
f4:60:df:86:a6:22:16:44:01:31:ef:59:8d:4e:24:63:5e:f0:
17:1c:9d:aa:c6:40:21:5e:bb:7c:05:57:a7:88:4b:cf:ee:25:
e6:b4:f3:87:56:f8:d3:aa:74:b5:af:15:e7:14:ce:6d:b2:cd:
63:e5:04:a0:fc:9b:21:2f:f2:89:3e:97:f9:e9:3c:45:83:f2:
a1:3f:4d:b1:3f:2b:f9:a2:3a:62:65:28:1e:7d:b3:ec:2d:7c:
69:78:39:fb
-----BEGIN CERTIFICATE-----
MIID3DCCAsSgAwIBAgIBBDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjET
MBEGA1UECAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3Qx
@ -64,19 +64,19 @@ EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMTIwODIw
MDAwMDAwWhcNMTIwODIxMDAwMDAwWjCBgDELMAkGA1UEBhMCR0IxGDAWBgNVBAgM
D05vdHRpbmdoYW1zaGlyZTETMBEGA1UEBwwKTm90dGluZ2hhbTEPMA0GA1UECgwG
U2VydmVyMRMwEQYDVQQLDApQcm9kdWN0aW9uMRwwGgYDVQQDDBN0ZXN0IGNsaWVu
dCBleHBpcmVkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAku97kRIA
Y5dB0ZUimmQGeH/CcRXykrEym3R5l/RwgLpCLmWvMD1d6u0r2nr58YstBCTeEHCM
1dgCw1+yBFZoxlb2IgAdW/NZKJxXcq3+RElPuYZ2wNvnQ9H9CyjtUmLnlVsnIUxX
yexYjvwcr42eHIV4BkuTEmOnl15irWGsl61os398wqPpXX+qLlCk+dKWKOLpkgML
t1ndY0r8AJS3XNWy/EUANLXKzCWMbNLd5aJe6EQW+7nifwnM0kQujzuAAbw1cGK+
jbCkc2HXHNqYx8yrzTKW0i4mPvjThT7OVRYNHjd0+tZjIs1z4RlwYFf3qmdNUXqH
UUTMXbXnGJGJMwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1P
cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUveXD1SPxZj0a
V091oxLF6auJr88wHwYDVR0jBBgwFoAUU0haUE14gG1VeYr+qaNoegSa8IcwDQYJ
KoZIhvcNAQELBQADggEBADRgmxA0UyASRgzs6s5M5/po6RyIJ7WgvjbR1eWBmYOd
SIpxOHo9E5YseCQzf/NFjeKM1DsXlElSDyDO24i6kfb+NBjyigiETxUtDj9K13m5
0/6/Bw8BHsQDHja2xNSO+3fZUURpxFLEkuxrdu3RCJND3N6ITo/Nq2+oRFMAX71E
8+Rzliv5J6UYJ71+q/bq2QTKO3gB2SbouakpTrx6eGigrcQcit8VTmUm4u4NP9es
RlMMop81nFQDeAdo5v08PyDJhwf21jfty/N7I2oTXSiDkc0OzRPTmdYaA2qhlawf
HOleoBefSx3H+JT2MIZrulTZ2ZOBZWFwuI8N0ukl8w8=
dCBleHBpcmVkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoGySmAhf
oPnsF1s7nHds0ZebXFIZVSPgX/0+r0wIwEJEoFDgeBlNagmwBhNqfpPJWbJJ87Md
KSbSGQ7DsZkpb+1gx8+YPVSAW7ua7OlgEbyZ4ZKr2Ur4xQFLvNhtAFDebohsPQfJ
aGYsBbX48nk/6rjqi/eAEBSHNbOODkE8CZhG9ghRIRHqjO2gwKn2qdwnE1Ko/0xD
OaFRzru1WhlPtC4SBtYGDpsbctP4zSXAIXAZiBNmsJHIg8y0DXWAhhz/xnFQbxLU
kR0zHvTf6nyxjhNGVdjWmc4NHpCbdyHIniFNJ+/eYGZEEo1MrN3YXVKbVzSSUFxW
/1xMdIg8+ON2MwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1P
cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQU5+hMMiIWhwUJ
+AmYStLKtKqxJLowHwYDVR0jBBgwFoAUMkEJ02Qi0+ngB9rj1VbIRGFG3DgwDQYJ
KoZIhvcNAQELBQADggEBAHnWSLIXdSX0EUbSt0RqwdYZbl2i3ARxamF9Cf3LdPK2
TQo8cjH0KAAv+dpr9aLxZd8E+Sb3F/TvLtrrE3L2XuGm0ZBGfaaBxl2X8xHPJjNb
S4Q2WRtb8XYnvSTbOstVRMnUYVIzzfMnLgDaw3sABrAlT8dc15/Tu2/QybodfvQn
q+YY914yugUsjd9ZflslxPePSezWFi0TMFdtPxrtpMQR+fRg34amIhZEATHvWY1O
JGNe8BccnarGQCFeu3wFV6eIS8/uJea084dW+NOqdLWvFecUzm2yzWPlBKD8myEv
8ok+l/npPEWD8qE/TbE/K/miOmJlKB59s+wtfGl4Ofs=
-----END CERTIFICATE-----

View File

@ -1,28 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCS73uREgBjl0HR
lSKaZAZ4f8JxFfKSsTKbdHmX9HCAukIuZa8wPV3q7Svaevnxiy0EJN4QcIzV2ALD
X7IEVmjGVvYiAB1b81konFdyrf5ESU+5hnbA2+dD0f0LKO1SYueVWychTFfJ7FiO
/ByvjZ4chXgGS5MSY6eXXmKtYayXrWizf3zCo+ldf6ouUKT50pYo4umSAwu3Wd1j
SvwAlLdc1bL8RQA0tcrMJYxs0t3lol7oRBb7ueJ/CczSRC6PO4ABvDVwYr6NsKRz
Ydcc2pjHzKvNMpbSLiY++NOFPs5VFg0eN3T61mMizXPhGXBgV/eqZ01ReodRRMxd
tecYkYkzAgMBAAECggEAEcruK6MCaQzn63kjt45lOjI+WXNO7HSIrEpubvgqp2vm
l7e4fx7vQIN3y/0YRyeTS+0q9tKqOzrtGrt70wqjpWDibTuWUowlP8Wu0TRAlgRK
oyylNLVsS8oh2jgahN91K6DeHCoid1EnaCkfUCLWAp4m6pw8Mv3eTXYgfN5XCAbI
rWqoxqu/N7KeA9ewqmO2OW6xff6wH6U8O7C7+1nP/Tc6S+bgj/uOqNCta/i/tXAX
SlnxKlagaOcwuUhRisFDJkzzHfhEViSlB6fEQ/ybgjC7NPIhAUlSvSuNibGy23Z+
QBfykuolCEf0QEDe7j701t4XxEYm0fTpYw/1zCzoAQKBgQDEN71IRGHVoZStVQgP
CrJNc2lxMNwk0vUB1nheAZZa+vx3BWC+oArZxHffbCvF8vIGSVfqje5kDPPtVSdE
kn6V9z+dWkeZJ721GkKFnb9v3/G0sqVc2t/ENyJea9FTK+t+QebLOEGlAPpZrZSJ
BGK6mgnLaEzenfC3ilNMVRuatwKBgQC/s+i3B+stbexaD0sFWdLYSO3DUzXuK/aJ
+Mqgs/fNMBE//hRex1+hZ7Mm6sa3fYi1tAtJMawt8dccYG8lPjIkor3Ws6yevWa0
HNas/QNvI1TbDLO+gENqFEepDyE0iu3bjSW9BcidianshGLdlMzhhW6VcoksDUXH
qk840tt5ZQKBgF70ZmophXrfldaHtr2ovH6Uoms/bNl5KU35XwiHFh7zJOfoN1go
lPerhyMc8tX5arw2FBCTHNFYH1c0BSu/BPlHzIY2YT2xqLGSgqysmS7nnc2HQlT8
KpuG3t/4pzTrpSvVcn3XvJTAM2bghGgGMk0BLEo+MCzvG8WGcCcZbKFjAoGBAKQ/
aflAAKDI2MOE7Nslzb/gJE7BQajR5AbssfekmoEkWPNCJ4PZQLdS2S1T5HScSwCb
xTuuIn6vAYZfnXsEYgP/p7WH9jN/xbo2JzzJ/yI+3Fpd9LcYwCnoPEm+G84f5pHA
yn+8r9lCdOOfvfFpp2zmXQwQuTSUHqBm7D+cccz9AoGBALBOb2ogM9oPfrHU7vlo
57EyHlwOpS2w2z3MdpkeUTv7lrIeoR+GVc6Nr4g7MclXjxEDagE9umLW9nDiEu+R
vxorBQIPSz/UWIae7QGc7ToqlijZg0AcGnyKUCSpHCdQryBEDBcHPCIlSB0Qe9Iw
Op/VjGVNwRe9NATmWHqRmHZu
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCgbJKYCF+g+ewX
Wzucd2zRl5tcUhlVI+Bf/T6vTAjAQkSgUOB4GU1qCbAGE2p+k8lZsknzsx0pJtIZ
DsOxmSlv7WDHz5g9VIBbu5rs6WARvJnhkqvZSvjFAUu82G0AUN5uiGw9B8loZiwF
tfjyeT/quOqL94AQFIc1s44OQTwJmEb2CFEhEeqM7aDAqfap3CcTUqj/TEM5oVHO
u7VaGU+0LhIG1gYOmxty0/jNJcAhcBmIE2awkciDzLQNdYCGHP/GcVBvEtSRHTMe
9N/qfLGOE0ZV2NaZzg0ekJt3IcieIU0n795gZkQSjUys3dhdUptXNJJQXFb/XEx0
iDz443YzAgMBAAECggEABhF1Thjq/RzXCF8kFxwRWrBAaTKV0LmlsBvVNi5LGnKn
Q+UrSH+0hPFO3jv3yEfw0trCn1xEGx1jzxzW3C3t+lThV02L9a3vmQi0qId/Ycxf
ib/Rjkues10EL2WEYgGtGENCzOAxhyhuO90RSKK7fzZ1cMvw5SrRnn9nPTTMf5Ra
rUU/rW+ml8MV/X4iutl4H2JdiXssC2+AndGuNmaOdd+LJm9f1jucoItw3U4pkvze
ewuo5cD3V93T7I6mGmKeYgvf2ahVULaxbcfg30pSDi9HosKG71UyPvtQZbkVwDoz
hprL21dyw31OXKDNshJSG6CkiHcmwqD07hNcv+7RoQKBgQDOg6Mr8cawqUrGWsEf
iEG7PB6PwhtGxp7M4sIzY7csf/nSaLbfW3YI87VZADZw1Wv1thdVlOC2IT+/kTgE
TWkMA3Ko59Qle6Kl7mM+ucZRL62GnH++NQs94GuzItK1qezCelx5GEaMTBnBTRvN
Sl2s+ITF9aL56VuP065a6me8owKBgQDG3ZgqLJMzVznAn+7Oj8Td919gMxnnN3im
3RLOD+oNRFA7SFsEqX6enURGSzplyzImGdgiuWUpBI8/n87rvy+WVtjeg9FuBUPO
GJQ/RntgAbtgTQDvuH9Q7aQYCPojpqgFLFrcVblEBNFTnc39JVYwxrPpkWKYfMiA
a4jwe8jpMQKBgCIvtnZS2uJp1AAMDAZNRxxYsnJ33o4T2Tvvmdhp/Gu4b8G+Je/J
szt+JJosJ9b77ZhKYYiAUca0sFnlD1HfArHDbFq7renakq1HTlSW6laMPvyWsarq
GwdOPGX2MM1z6Ma0/NPrCdq1ylmuixir49/7b/dZV3ZphAfGMgnI3g1jAoGBAJ8D
ygzPH9VJxhBU0muxYkXq7ATMV8YfAQbMd6D18L0zBsSgkscjkO/b6SAcP1HuLOdy
evUpMc6eqrzBWIABnFemkjs7RFepNhKybLg776NRPzc926XT7VoU68WcSAgB1xBr
6yuMEFxnTcqCwJfPJyBRgsMdUa2E+f5V/mXtVTXBAoGBAIC+fhh+ZWATkfqFF8hg
8Qnx+hdPAAgBm4i2VhirOz6UZei2WcC+XRdLyLByU3n0o1VHT55K4escu450qoF5
ayjR4QPzU4WHhItSBw3P33p/EoM1QZ/Dcb+ALpF816g7qs1WWwYaHOr4+q+J/419
HTp3CEBSo0RKKXQfK/oBsKoR
-----END PRIVATE KEY-----

View File

@ -5,31 +5,31 @@ Certificate:
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=GB, ST=Derbyshire, O=Mosquitto Project, OU=Testing, CN=Signing CA
Validity
Not Before: Jan 15 05:59:52 2025 GMT
Not After : Jan 14 05:59:52 2030 GMT
Not Before: Feb 25 13:42:37 2025 GMT
Not After : Feb 24 13:42:37 2030 GMT
Subject: C=GB, ST=Nottinghamshire, L=Nottingham, O=Server, OU=Production, CN=test client revoked
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:99:58:9f:27:49:10:a8:f0:10:40:c5:2a:2e:e9:
a8:1d:08:a9:50:de:6f:57:94:cb:02:e6:f8:c4:40:
f8:ae:99:d6:7b:63:ca:d3:9a:ea:2e:79:5f:b6:90:
74:aa:59:36:ee:f5:5c:ad:6d:1d:6f:a3:1a:03:1a:
52:fa:67:14:61:ac:14:63:bb:e2:52:00:63:78:cd:
e3:bf:96:4e:a3:ed:14:57:2e:52:82:88:b9:5f:8f:
30:42:a9:13:8f:db:ab:9f:24:db:6b:bc:4f:9c:f2:
e0:0a:db:4e:82:0e:18:50:fb:4a:c1:90:6e:f8:c3:
8a:d3:ea:1d:ff:5f:ae:59:80:37:f6:6d:56:5b:4c:
25:73:e9:49:db:d2:05:2f:eb:89:9d:db:67:7e:54:
57:a8:97:f8:7b:4a:b3:69:f5:1f:cb:a1:00:ee:14:
12:7c:a7:2a:ce:0e:67:85:67:49:22:43:78:d9:9f:
c9:ad:a2:82:e9:5b:1b:e8:05:31:d8:94:43:1a:46:
6e:dd:52:7f:5e:35:61:47:3e:f7:5e:8c:b5:2d:4c:
f3:5b:57:46:6c:b3:fd:7d:c9:f2:ab:c1:1e:80:91:
a3:a2:e2:d3:70:e7:15:c9:ea:ec:0f:ee:67:6d:cc:
4c:e3:96:4d:43:c7:85:3d:5d:66:fb:7b:4e:68:7b:
1b:af
00:ec:7f:3a:38:e8:e4:8c:90:d9:df:2a:59:ab:a8:
cb:74:4b:fe:17:c1:3c:e8:fd:ba:cf:47:93:2d:29:
4b:2e:3b:40:dd:29:ae:70:d3:d7:67:20:01:da:a6:
eb:27:96:58:a1:f1:a4:a5:31:dc:77:70:97:99:ea:
ad:39:35:90:41:b2:8c:5a:16:b6:b1:75:c4:b5:bb:
ef:bd:e5:6b:a4:e1:4a:70:03:4e:59:57:a6:db:d2:
c2:a2:01:7d:30:3f:d9:16:60:27:fb:47:0f:0a:cb:
4e:d6:4b:fd:b6:47:18:6c:31:ee:5f:fd:8e:a0:37:
02:10:26:2a:34:ad:10:5c:a8:ee:a5:8d:73:6a:29:
f8:e6:88:24:15:63:c1:b6:93:12:0c:ed:9c:6d:7f:
b4:9b:2d:fd:21:c5:9e:7b:2f:d7:b4:bb:b9:45:c0:
49:f5:7d:58:9d:cc:cc:34:1a:25:16:5a:17:18:c8:
81:3b:66:a2:57:08:eb:bf:93:a6:a1:b6:7d:4a:49:
e5:f3:90:45:22:c9:e2:cf:38:a3:e5:b0:d9:09:b4:
60:89:5e:ce:fd:5b:48:e7:65:55:09:6f:e9:8b:ab:
7d:0f:95:d6:8b:1c:ff:fe:5a:9d:58:4a:d3:a4:e7:
c3:3d:2b:2f:b4:c5:e6:b7:f6:25:5c:ec:f4:ca:e3:
66:c9
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
@ -37,46 +37,46 @@ Certificate:
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
75:6B:E0:DD:BC:BB:50:A9:B1:C4:D2:DD:4E:04:0A:22:97:99:F6:F6
2F:D9:19:74:8B:87:D5:1B:33:BD:59:A4:2D:90:79:77:9E:CB:B8:28
X509v3 Authority Key Identifier:
53:48:5A:50:4D:78:80:6D:55:79:8A:FE:A9:A3:68:7A:04:9A:F0:87
32:41:09:D3:64:22:D3:E9:E0:07:DA:E3:D5:56:C8:44:61:46:DC:38
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
99:97:90:7c:02:51:20:47:d4:1d:1a:e3:4a:97:9d:a5:bc:9c:
0c:40:ae:8d:56:6a:2a:c5:32:0f:b8:91:1f:05:2d:3c:ca:69:
6f:c6:a2:ef:10:c4:1c:dc:17:c4:e1:df:73:2f:49:b7:26:f5:
b0:06:ed:e1:93:f4:09:f1:62:b5:82:14:52:21:9b:e1:7a:78:
45:d0:8a:14:42:08:f5:ae:7e:4d:ff:c1:cd:45:36:64:a0:35:
e6:de:3f:27:30:3b:50:78:37:b9:43:82:94:48:41:a2:a7:77:
68:9c:f1:4c:c1:66:b3:bf:c0:73:d0:47:14:db:e5:ed:cd:0f:
40:5a:d2:ca:35:dd:3a:9c:30:75:88:c6:fe:1b:98:ba:be:00:
65:10:b5:52:87:ae:3f:a6:5f:ac:df:45:df:af:e8:9d:32:91:
72:07:96:19:20:a2:70:39:79:23:f2:58:dc:e3:7d:ea:4a:aa:
62:4e:31:64:04:b0:87:04:06:45:94:60:59:76:81:72:3b:66:
a1:94:fa:1c:af:ee:63:34:1a:f7:be:50:77:83:04:f0:33:3a:
62:af:d8:b6:23:4b:4d:71:96:74:b9:6a:fd:44:60:94:18:94:
6b:67:65:5f:73:52:02:ff:f1:f2:41:e3:2e:2a:5c:a5:38:fa:
a2:82:9a:25
14:4f:5a:7e:1a:ae:b1:be:44:19:59:6e:83:73:53:e1:7a:fc:
e3:9e:ac:e4:b7:0a:6c:8d:09:20:f7:c0:48:19:3c:96:f7:4e:
62:e4:4e:4e:12:44:f8:37:63:39:df:2e:87:64:a7:d2:b5:a7:
a0:0e:70:1b:8d:0d:6f:eb:e6:f9:ee:98:67:d6:e1:5b:76:eb:
e6:e4:b9:d5:bf:45:2c:58:53:cb:5d:63:79:4e:6a:eb:13:3c:
cb:9f:cb:67:fd:68:9f:0d:9d:f9:5c:cd:e3:88:66:44:b7:f9:
f4:b2:7b:c8:4b:eb:0f:25:a8:dc:af:aa:86:e9:af:b8:84:0f:
3c:43:45:d5:c6:b4:e6:5f:00:0d:53:58:3a:5e:a5:1b:e3:f6:
29:dc:2e:b5:95:fa:e2:8c:7f:0e:5f:0d:7b:ea:70:75:6b:a4:
08:55:19:da:f7:0b:25:29:c7:cb:c8:d1:93:40:85:10:39:d4:
4a:8c:df:a0:cd:f5:7e:a3:9a:14:bb:5b:cd:23:81:2a:df:fa:
d0:39:12:e5:a1:97:06:af:a2:e8:3a:50:c8:4f:92:c2:a5:da:
ba:b6:d0:60:c0:a3:c2:6e:e1:bd:08:47:6f:53:e7:c6:b0:70:
79:c3:a5:a6:bd:ae:99:67:6d:6a:b2:b2:62:13:a8:63:c1:53:
51:42:68:a0
-----BEGIN CERTIFICATE-----
MIID3DCCAsSgAwIBAgIBBTANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjET
MBEGA1UECAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3Qx
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMTE1
MDU1OTUyWhcNMzAwMTE0MDU1OTUyWjCBgDELMAkGA1UEBhMCR0IxGDAWBgNVBAgM
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMjI1
MTM0MjM3WhcNMzAwMjI0MTM0MjM3WjCBgDELMAkGA1UEBhMCR0IxGDAWBgNVBAgM
D05vdHRpbmdoYW1zaGlyZTETMBEGA1UEBwwKTm90dGluZ2hhbTEPMA0GA1UECgwG
U2VydmVyMRMwEQYDVQQLDApQcm9kdWN0aW9uMRwwGgYDVQQDDBN0ZXN0IGNsaWVu
dCByZXZva2VkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmVifJ0kQ
qPAQQMUqLumoHQipUN5vV5TLAub4xED4rpnWe2PK05rqLnlftpB0qlk27vVcrW0d
b6MaAxpS+mcUYawUY7viUgBjeM3jv5ZOo+0UVy5Sgoi5X48wQqkTj9urnyTba7xP
nPLgCttOgg4YUPtKwZBu+MOK0+od/1+uWYA39m1WW0wlc+lJ29IFL+uJndtnflRX
qJf4e0qzafUfy6EA7hQSfKcqzg5nhWdJIkN42Z/JraKC6Vsb6AUx2JRDGkZu3VJ/
XjVhRz73Xoy1LUzzW1dGbLP9fcnyq8EegJGjouLTcOcVyersD+5nbcxM45ZNQ8eF
PV1m+3tOaHsbrwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1P
cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUdWvg3by7UKmx
xNLdTgQKIpeZ9vYwHwYDVR0jBBgwFoAUU0haUE14gG1VeYr+qaNoegSa8IcwDQYJ
KoZIhvcNAQELBQADggEBAJmXkHwCUSBH1B0a40qXnaW8nAxAro1WairFMg+4kR8F
LTzKaW/Gou8QxBzcF8Th33MvSbcm9bAG7eGT9AnxYrWCFFIhm+F6eEXQihRCCPWu
fk3/wc1FNmSgNebePycwO1B4N7lDgpRIQaKnd2ic8UzBZrO/wHPQRxTb5e3ND0Ba
0so13TqcMHWIxv4bmLq+AGUQtVKHrj+mX6zfRd+v6J0ykXIHlhkgonA5eSPyWNzj
fepKqmJOMWQEsIcEBkWUYFl2gXI7ZqGU+hyv7mM0Gve+UHeDBPAzOmKv2LYjS01x
lnS5av1EYJQYlGtnZV9zUgL/8fJB4y4qXKU4+qKCmiU=
dCByZXZva2VkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7H86OOjk
jJDZ3ypZq6jLdEv+F8E86P26z0eTLSlLLjtA3SmucNPXZyAB2qbrJ5ZYofGkpTHc
d3CXmeqtOTWQQbKMWha2sXXEtbvvveVrpOFKcANOWVem29LCogF9MD/ZFmAn+0cP
CstO1kv9tkcYbDHuX/2OoDcCECYqNK0QXKjupY1zain45ogkFWPBtpMSDO2cbX+0
my39IcWeey/XtLu5RcBJ9X1YnczMNBolFloXGMiBO2aiVwjrv5OmobZ9Sknl85BF
Isnizzij5bDZCbRgiV7O/VtI52VVCW/pi6t9D5XWixz//lqdWErTpOfDPSsvtMXm
t/YlXOz0yuNmyQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1P
cGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUL9kZdIuH1Rsz
vVmkLZB5d57LuCgwHwYDVR0jBBgwFoAUMkEJ02Qi0+ngB9rj1VbIRGFG3DgwDQYJ
KoZIhvcNAQELBQADggEBABRPWn4arrG+RBlZboNzU+F6/OOerOS3CmyNCSD3wEgZ
PJb3TmLkTk4SRPg3YznfLodkp9K1p6AOcBuNDW/r5vnumGfW4Vt26+bkudW/RSxY
U8tdY3lOausTPMufy2f9aJ8NnflczeOIZkS3+fSye8hL6w8lqNyvqobpr7iEDzxD
RdXGtOZfAA1TWDpepRvj9incLrWV+uKMfw5fDXvqcHVrpAhVGdr3CyUpx8vI0ZNA
hRA51EqM36DN9X6jmhS7W80jgSrf+tA5EuWhlwavoug6UMhPksKl2rq20GDAo8Ju
4b0IR29T58awcHnDpaa9rplnbWqysmITqGPBU1FCaKA=
-----END CERTIFICATE-----

View File

@ -1,28 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCZWJ8nSRCo8BBA
xSou6agdCKlQ3m9XlMsC5vjEQPiumdZ7Y8rTmuoueV+2kHSqWTbu9VytbR1voxoD
GlL6ZxRhrBRju+JSAGN4zeO/lk6j7RRXLlKCiLlfjzBCqROP26ufJNtrvE+c8uAK
206CDhhQ+0rBkG74w4rT6h3/X65ZgDf2bVZbTCVz6Unb0gUv64md22d+VFeol/h7
SrNp9R/LoQDuFBJ8pyrODmeFZ0kiQ3jZn8mtooLpWxvoBTHYlEMaRm7dUn9eNWFH
PvdejLUtTPNbV0Zss/19yfKrwR6AkaOi4tNw5xXJ6uwP7mdtzEzjlk1Dx4U9XWb7
e05oexuvAgMBAAECggEAAwpMwtH3W0IXMGbi+ox2DCKl02KgQSjutXSwLe6T1PJb
3D+9lQsXOtX73c9otg/lakDBwPZ5hO3DkELaA6OTizQxhfYC+1k39PyFWBZkzL81
41yZv4NybsCUq7L/yPRep13AXpcchPdpFbivX8i5FrHvaNMHlYsFmkSj/5zSr2zh
fpIHPVfo9HuJCO9z7YR4+u/akJ/9RJV7Dda6bl+P+BFAXYegCPRwyfUsvjLVKLCC
ct186ivmYSiFaUMIRHtbAwdUJVbpaMeJZ24bEKqU1zBMM8I5JwLsTjhe+ohkwHfK
m8sSbWNEIrnkaw+qOKRx81UyBIVJFWCrFa7AstQVcQKBgQDGMDaKEaf0/UE59nUs
PjhiEh6L8sulJQZSfLfRsXd/gjRvF0iPrvogdvzkcghRpjxSz5awMmtswQCbOuN8
8wwaVJnFtnUhms1eYM7wwPMPdOJUlbLpFNTWeyGaT1rSaU2LS8PB4XKX9LpQVXtg
KBfNrUUQdwIZKG/YhHKjkL1kpQKBgQDGE83jIokSkeFs7hEmxkaP0oCI9psbewPc
xRXqTdYWkwCD5LhJ0Jpwc5QRDnaa2JAvObpVT/jZh0XmYizVLEWqNP3dsPeetfQg
ACW3QoNqQ69vm0ODD1oZQZJvscTg3xKggAiyHDDPI7s4G+TrGlwdAa7i4alkM5TN
+A0O4dUKwwKBgQDEYH2KLZiJDnCVKHpODpD7zAxsi3Xx+0/aaC4UH47Sz4d5FE8X
4D+D76MCEWPg06EuRPeBO1RqfItHRQCojIPPi0ibOgGx/JvGCpLCx82P4TdqrLKM
ddG3fGZ9amgJ2cG2Zqpf8C4GF76NX0ZSryd261tlxyZTG1hH6GVXYVHo6QKBgQCf
1dNJ+dBKX9VcJS9J7q152Q9HdlfrcPTI7XClxXGAfdbol2PujJpTK7DLorQqd57B
vP+TYBkaz4GkSoyK6FK+6kwA3JC0TXdVa0kD/HQ3B69FjDCKTZUS1ErqPrT0EI3j
Xe2mbAEm5VpqCHhNDtRNw9Hv2tDpvoXRPtyqqalUKQKBgFC4FWxduhfjPzN7+CVX
71Vgfd6E9X1wosTbmnG6NWa8acA0lGGbV/wnN4SHKCKIJjcN0wC6lwLb1prUvOfY
MfN87dE6QssGGiZKC8GhVnWnlvE40zJOYfKrJiSLwJsElWN3nOHnyOUmF3qSNpN7
V089eME3g1KxoxuVqusDkITa
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDsfzo46OSMkNnf
KlmrqMt0S/4XwTzo/brPR5MtKUsuO0DdKa5w09dnIAHapusnllih8aSlMdx3cJeZ
6q05NZBBsoxaFraxdcS1u++95Wuk4UpwA05ZV6bb0sKiAX0wP9kWYCf7Rw8Ky07W
S/22RxhsMe5f/Y6gNwIQJio0rRBcqO6ljXNqKfjmiCQVY8G2kxIM7Zxtf7SbLf0h
xZ57L9e0u7lFwEn1fVidzMw0GiUWWhcYyIE7ZqJXCOu/k6ahtn1KSeXzkEUiyeLP
OKPlsNkJtGCJXs79W0jnZVUJb+mLq30PldaLHP/+Wp1YStOk58M9Ky+0xea39iVc
7PTK42bJAgMBAAECggEAFgUKkL3uecAK6SJyUu9Wci+ZKvENEMx/FkmdxHixzU4r
DeyRl2PCDJIIWilsf7UZ74omQFNSKbTMCMK2+jqogdV0B/dRb1h9xkYHXnD8AtAP
NDq6ksr8eD85bAgjddicB99QGa9WETU40+8jYlNgTMKhZUKggv5cLNDA4UKz4UyT
iBeb1AWC4UB/A9qbOTLiKDX1QZoWLsNxsIXnp2AxmMb26yZcsUFPyGzQ/SjhGKlw
cu0fJsiTBkixqMMu376SLVHHLbHEFjGYeCKi8sh8yrtga5opIitxl0qxqV2eIaVF
fovi1XAvcvetgImTza/kkpGSf5OTdhCssiU8RyFyuQKBgQD6YRt4j/hHhoLHLgth
wPXimZ9qNOfbpFuP6Y3fLWEIbz2WAo3d1FOyeF+C10pMhYHb2cSD6ahwotmwU21D
6od66YVcpsI62UvVtDORiI3lfdBg4hHXZGSvFVN4IIfVVlqWwYt1SWMGWVivpRDD
s5U7hwCpi1lRmwBXPRZTlwoy5wKBgQDxzlciDWew7Gxjr3qlxzWA4MyVFPXVEZqc
CoFo/nA0rJc9Gdxspies9CX9gv69Ozy0j2qau4+iRVrzM4+0O/KZf7szpzeFNl/8
FW+BD7bQK6RuygOEjBnviueeJRkaB1wt4pTvrNU1K4wFBGdGF+6rhT4HlP1cviPB
FZrJS3ASzwKBgQChC9kJoUEHcKOpzhoQFHeT+1AolkMUahFi7c0NYjjpnfO1C4uI
xcvYHckBdc0ajz1J1jaqyp5HZNg0rFS5vJ7MFmxrfe+svpwipzgMQhNTK6vexUrI
ipCgdU0tFW+Jb3PxSCiVllCVgt6ii7/OwTIaCeoJI9KdxN9hPa+gsKQkvQKBgQCS
gN0D8bFAXY4yO5CIvpCpHAp3zPJA/OB66FaN4ZLkJymeyHtnjKf/PxGBboue5TQb
hcUmKLuWqoS3UycfIS8UV3J5kjeuS0qOdgJP5NBzge2nflfxR90y6Cr7AykZPxpX
Zq+sI0AubcrxA0D7E+b0Hs99UoTLWxxYkRluGnm1uwKBgQDQyXnEMKaKCITVgn7E
0+HqhczKk4otlC8FmoMDwuchI9tIhuxnqycIxBOg31Vv/8cMCyr1g4zmRuweVoxG
P37qJT90ch1p4hPAgGHXBLM5dHzbiQflohraOGLBPEFOdDd5rs6P+nmrKj+IJDBh
KzTSA6L3If/yQBJxYVsidXffSQ==
-----END PRIVATE KEY-----

View File

@ -5,31 +5,31 @@ Certificate:
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=GB, ST=Derbyshire, O=Mosquitto Project, OU=Testing, CN=Signing CA
Validity
Not Before: Jan 15 05:59:52 2025 GMT
Not After : Jan 14 05:59:52 2030 GMT
Not Before: Feb 25 13:42:37 2025 GMT
Not After : Feb 24 13:42:37 2030 GMT
Subject: C=GB, ST=Nottinghamshire, L=Nottingham, O=Server, OU=Production, CN=test client
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d7:bd:6e:51:84:12:50:b4:f9:9c:13:8b:c2:2b:
a4:ee:5c:50:4f:1d:04:67:ad:e8:30:98:a6:fa:7d:
66:e3:a9:a9:08:b0:61:f9:ce:3e:8c:52:f2:24:64:
1c:9c:df:3f:7d:56:2e:3a:ed:e8:49:d2:61:6d:7f:
49:64:56:36:68:65:c3:32:fb:2d:88:5a:94:6a:d8:
6c:27:3b:c6:da:62:45:be:9e:a7:29:4c:0e:78:9b:
2a:79:94:eb:c6:06:f3:ed:60:ee:79:81:38:10:8b:
e7:c9:21:08:b8:0d:32:88:6e:30:9f:82:c1:66:4d:
c5:ae:f8:5f:55:0a:0f:2a:36:a5:b1:84:ee:2a:f7:
11:00:c0:b2:64:1d:f7:f9:02:1c:cd:d8:56:46:c6:
9f:17:d6:f3:d3:b2:f2:20:98:39:ad:9b:ff:b1:9f:
a8:b3:6a:3e:e7:d8:51:25:15:58:36:ac:8e:a7:25:
cb:f9:79:12:98:0c:e0:63:d4:d8:72:c9:83:ac:e9:
93:32:09:95:ed:f7:56:e5:44:b7:46:5e:6c:ca:58:
c7:80:5b:b5:67:2e:8d:5f:c6:91:50:cc:97:2f:3b:
ab:a6:5a:b5:18:e1:74:95:b9:ed:b4:e6:1c:7a:ab:
5f:4a:14:2e:78:5c:be:90:78:61:09:76:c6:65:1e:
3f:cb
00:b3:2d:d8:67:09:2f:3d:99:40:e3:47:67:2e:26:
bd:bd:1f:d0:d4:64:12:18:9c:3e:e1:71:1b:58:82:
b1:5b:d5:a7:b3:b2:de:10:e7:48:91:e4:5b:97:89:
57:5b:66:e2:2d:4f:eb:44:ba:96:b1:ac:61:19:73:
b3:00:80:8e:b8:34:15:50:14:30:31:18:30:fc:70:
9f:eb:66:40:ed:16:45:46:6d:7d:5a:39:56:ba:ab:
ce:16:d0:21:98:d6:a5:bd:e5:c8:17:27:95:8f:1c:
8e:ac:14:a4:00:7a:05:0a:85:d4:ab:94:30:2b:70:
16:7b:fe:ad:c2:dd:93:34:69:bf:18:34:06:15:29:
da:6a:22:22:1c:84:a8:6b:18:46:db:3e:bc:3b:2d:
f0:4b:05:24:c7:48:f8:00:db:7e:e4:0b:a8:e6:e4:
12:2b:6d:8b:33:52:02:5f:ec:2e:09:a7:55:69:be:
40:bb:2e:5f:be:e1:47:cf:9f:dc:71:98:e5:b0:cb:
bc:da:c6:54:bd:7a:83:b6:8e:4e:e6:06:45:89:25:
82:9b:8d:2b:92:6c:e0:2a:8e:31:82:f6:f2:0e:27:
82:c8:6b:23:52:d1:c9:67:0f:0e:cf:17:4b:cc:a6:
02:e7:8e:8f:2d:75:d6:8a:81:3f:64:7d:f0:f2:48:
c2:cb
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
@ -37,46 +37,46 @@ Certificate:
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
65:3E:01:5F:06:CF:CE:02:5B:42:F5:D4:E6:C6:92:A6:F6:CE:5C:BF
16:AF:74:3C:9E:6E:D8:2E:B9:DB:B3:15:51:0B:F4:05:32:E3:62:78
X509v3 Authority Key Identifier:
53:48:5A:50:4D:78:80:6D:55:79:8A:FE:A9:A3:68:7A:04:9A:F0:87
32:41:09:D3:64:22:D3:E9:E0:07:DA:E3:D5:56:C8:44:61:46:DC:38
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
7a:aa:8a:0a:11:54:15:d1:c1:e0:a3:d5:7b:37:26:d3:a1:c8:
5f:fe:0a:f6:34:c9:3d:0b:87:af:d7:7b:81:0f:cd:cd:f6:bc:
18:b3:4a:1a:32:4d:38:86:30:b5:09:7f:b5:cc:50:be:e1:9b:
80:50:41:10:2c:96:19:3c:5a:3f:e1:5d:a8:a1:ba:01:ec:f6:
ec:79:3a:22:43:19:f7:12:9d:9d:be:ef:35:10:7a:ab:77:80:
ae:75:a9:72:3e:5d:39:99:7c:0e:4b:f5:28:fd:3d:ba:11:1f:
dd:15:5b:0b:4f:9d:ae:bd:6a:69:ad:00:61:5d:1c:87:ab:17:
03:b3:45:d2:20:97:3c:c2:6f:42:f8:de:53:3d:4b:ce:9d:be:
94:0b:19:48:a3:fa:29:39:3b:14:f7:d7:cc:58:29:f9:ce:1c:
25:7d:6a:c8:68:50:01:38:e8:b2:c2:89:22:b6:ac:d3:8b:ba:
2f:71:5c:33:ac:cb:28:2c:1f:b8:58:9c:aa:73:47:d2:6b:66:
9b:a5:2a:06:77:e5:53:63:0b:be:78:33:d7:bd:0e:3a:de:20:
25:3d:3b:a3:aa:b1:0d:45:64:6a:70:07:4c:2e:41:64:22:f7:
32:9c:08:80:6b:ca:44:53:f6:60:e3:ea:7c:de:87:d1:7e:75:
73:47:9d:b2
df:7b:2f:59:d9:e8:8e:0f:52:d8:0a:be:18:fb:a8:5a:3a:54:
09:32:06:64:4b:29:14:5c:4b:7f:70:f9:38:bd:f9:d1:0d:16:
a6:64:dd:05:94:2e:c9:6c:1e:e7:44:7e:84:47:50:99:8c:48:
7d:9d:1a:4d:fe:c3:af:86:fe:0c:08:b4:76:42:a1:86:da:c0:
93:41:64:e9:b8:b7:50:c1:bb:79:f7:c0:da:13:d2:2f:22:56:
53:d6:d6:80:f3:53:9b:02:be:e3:74:fa:45:0a:c9:10:2a:b9:
dc:6d:22:d2:32:c6:9b:cd:3e:61:2d:62:19:e6:e1:4e:11:e5:
68:57:87:86:8f:e9:66:16:6c:94:01:70:a6:80:3f:fd:07:f3:
0f:33:da:7b:40:7d:20:1d:55:db:10:5f:50:b4:28:4a:23:e1:
bc:69:99:da:45:ba:1d:36:b1:f5:67:9b:41:5b:cd:4f:9e:54:
cc:e4:4a:8c:47:c2:ef:55:16:01:78:6d:cc:3d:4c:a6:c8:18:
6b:51:6c:da:63:e5:ce:c6:a6:c3:87:65:ec:c5:34:b6:55:71:
a1:8c:ff:0d:36:4e:89:00:2e:2c:90:e7:f4:36:73:ca:8f:16:
49:1c:65:d8:eb:c6:2b:fb:06:01:63:18:d9:b5:38:41:e5:34:
bc:c1:62:e1
-----BEGIN CERTIFICATE-----
MIID0zCCArugAwIBAgIBAzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjET
MBEGA1UECAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3Qx
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMTE1
MDU1OTUyWhcNMzAwMTE0MDU1OTUyWjB4MQswCQYDVQQGEwJHQjEYMBYGA1UECAwP
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMjI1
MTM0MjM3WhcNMzAwMjI0MTM0MjM3WjB4MQswCQYDVQQGEwJHQjEYMBYGA1UECAwP
Tm90dGluZ2hhbXNoaXJlMRMwEQYDVQQHDApOb3R0aW5naGFtMQ8wDQYDVQQKDAZT
ZXJ2ZXIxEzARBgNVBAsMClByb2R1Y3Rpb24xFDASBgNVBAMMC3Rlc3QgY2xpZW50
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA171uUYQSULT5nBOLwiuk
7lxQTx0EZ63oMJim+n1m46mpCLBh+c4+jFLyJGQcnN8/fVYuOu3oSdJhbX9JZFY2
aGXDMvstiFqUathsJzvG2mJFvp6nKUwOeJsqeZTrxgbz7WDueYE4EIvnySEIuA0y
iG4wn4LBZk3FrvhfVQoPKjalsYTuKvcRAMCyZB33+QIczdhWRsafF9bz07LyIJg5
rZv/sZ+os2o+59hRJRVYNqyOpyXL+XkSmAzgY9TYcsmDrOmTMgmV7fdW5US3Rl5s
yljHgFu1Zy6NX8aRUMyXLzurplq1GOF0lbnttOYceqtfShQueFy+kHhhCXbGZR4/
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsy3YZwkvPZlA40dnLia9
vR/Q1GQSGJw+4XEbWIKxW9Wns7LeEOdIkeRbl4lXW2biLU/rRLqWsaxhGXOzAICO
uDQVUBQwMRgw/HCf62ZA7RZFRm19WjlWuqvOFtAhmNalveXIFyeVjxyOrBSkAHoF
CoXUq5QwK3AWe/6twt2TNGm/GDQGFSnaaiIiHISoaxhG2z68Oy3wSwUkx0j4ANt+
5Auo5uQSK22LM1ICX+wuCadVab5Auy5fvuFHz5/ccZjlsMu82sZUvXqDto5O5gZF
iSWCm40rkmzgKo4xgvbyDieCyGsjUtHJZw8OzxdLzKYC546PLXXWioE/ZH3w8kjC
ywIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdl
bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUZT4BXwbPzgJbQvXU5saSpvbO
XL8wHwYDVR0jBBgwFoAUU0haUE14gG1VeYr+qaNoegSa8IcwDQYJKoZIhvcNAQEL
BQADggEBAHqqigoRVBXRweCj1Xs3JtOhyF/+CvY0yT0Lh6/Xe4EPzc32vBizShoy
TTiGMLUJf7XMUL7hm4BQQRAslhk8Wj/hXaihugHs9ux5OiJDGfcSnZ2+7zUQeqt3
gK51qXI+XTmZfA5L9Sj9PboRH90VWwtPna69ammtAGFdHIerFwOzRdIglzzCb0L4
3lM9S86dvpQLGUij+ik5OxT318xYKfnOHCV9ashoUAE46LLCiSK2rNOLui9xXDOs
yygsH7hYnKpzR9JrZpulKgZ35VNjC754M9e9DjreICU9O6OqsQ1FZGpwB0wuQWQi
9zKcCIBrykRT9mDj6nzeh9F+dXNHnbI=
bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUFq90PJ5u2C6527MVUQv0BTLj
YngwHwYDVR0jBBgwFoAUMkEJ02Qi0+ngB9rj1VbIRGFG3DgwDQYJKoZIhvcNAQEL
BQADggEBAN97L1nZ6I4PUtgKvhj7qFo6VAkyBmRLKRRcS39w+Ti9+dENFqZk3QWU
LslsHudEfoRHUJmMSH2dGk3+w6+G/gwItHZCoYbawJNBZOm4t1DBu3n3wNoT0i8i
VlPW1oDzU5sCvuN0+kUKyRAqudxtItIyxpvNPmEtYhnm4U4R5WhXh4aP6WYWbJQB
cKaAP/0H8w8z2ntAfSAdVdsQX1C0KEoj4bxpmdpFuh02sfVnm0FbzU+eVMzkSoxH
wu9VFgF4bcw9TKbIGGtRbNpj5c7GpsOHZezFNLZVcaGM/w02TokALiyQ5/Q2c8qP
FkkcZdjrxiv7BgFjGNm1OEHlNLzBYuE=
-----END CERTIFICATE-----

View File

@ -1,28 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDXvW5RhBJQtPmc
E4vCK6TuXFBPHQRnregwmKb6fWbjqakIsGH5zj6MUvIkZByc3z99Vi467ehJ0mFt
f0lkVjZoZcMy+y2IWpRq2GwnO8baYkW+nqcpTA54myp5lOvGBvPtYO55gTgQi+fJ
IQi4DTKIbjCfgsFmTcWu+F9VCg8qNqWxhO4q9xEAwLJkHff5AhzN2FZGxp8X1vPT
svIgmDmtm/+xn6izaj7n2FElFVg2rI6nJcv5eRKYDOBj1NhyyYOs6ZMyCZXt91bl
RLdGXmzKWMeAW7VnLo1fxpFQzJcvO6umWrUY4XSVue205hx6q19KFC54XL6QeGEJ
dsZlHj/LAgMBAAECggEAGgHrlScbQCB5ANA4Zml1ggid49OnLsp/tbAJXSQV7bcL
uhDtVrx+vNLY/vsUmfKtyDHF8/OvL4sNlLImClL8TxyJahFunUPyJWk+rIIfyD7V
kpO0qh1Rl0d5WNvTinVXHZQ0W3Bw7km3YP86+lkY8Op7sRcFsowImz203F8QkfF4
yRAPG7+Z2YwSMexVLjdBtmM3B3qJyt5Suls5QBFxSsMrEBrCcheQyqDXKq/I/fCW
xZIvv3okrly10qX+3aO5LU8623OKQXgE3wDcWCiSRRnZR6BWOAPfycMwlxTmSkX4
7IW9xlycBQR+TL3neNuf/NP6R+2/O8yobbhTemg0+QKBgQD5GCiNkyia0iJyvXFS
NqKFZBV98HLKixZD0shGoubZymoYTV/g/nAhnFYJvtDjfRL5g/MXuK1mgEbgW+wx
6BbGdbQwJ14mo3V0PuTiBQjQcAF3JjM3lWmYLkT+DLc2Dr5SWyorP8CPO2HQrpTk
gMszAmQa5gaFEa6COKg30rY5OQKBgQDduI3FKXeqwE3+ppvTtIXtMgfAtYqhlTjq
b8TaJFGxaCVSKrktJj3Kuc3yUxH3Xd1IJItMwKlR5h6NMv6WQUD+igBSUNugo/q4
q8tZ5XVaESOJqGARUp3vSqbPo+IjYJtQsN1qRKEWCMkPW/OqCtoJoGRlS4kLIANl
AB+KtVjVIwKBgElKjWwSl4juOUqPaQ9qmekrqJM0s2HbCMMN+vWlqsz8HLln0sUt
uCp7iGk3pti4jWOzKkyZfxPAvJn5EgchJcphCZJ9kttFjyKT+t5x4sUJn7TCHaHG
KZqoSo6BiUqzjdZHkqHFEVBThZVUOOT+7Erm8jNj6RkwOauBJiW+rvUpAoGBAJgg
VnVevFKV223LlsMs628RkqwwY0v2fLStt10M6lhU4rZ7xc4qnN8JmTqYsI0PBBLJ
sCIbVpFw2Kl8wZ0KbLO4r/vKqsaPfClVBhNKEriXZdC/jBqWmvJiQA3bnf8z+5zj
nSeaqwPZR0qYhpi3FV7hg8DUkNTnRCz6ZqnfP3INAoGAajKfUcSfiWvZ6MaFlXf5
tyXybzo3rWrdzz4nsd+/jl7gpH6S/F4XIGrk3r9ythqN2kN5LMzB+LaHqSatjvGl
92BuSSg+nMlePM7PXq8LS+vuQ2wgJolaxoUqKPw1hRVdtSZzxQqANDaX9ssiqTes
hFSekDqb53/OZDKgOY2MRjA=
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCzLdhnCS89mUDj
R2cuJr29H9DUZBIYnD7hcRtYgrFb1aezst4Q50iR5FuXiVdbZuItT+tEupaxrGEZ
c7MAgI64NBVQFDAxGDD8cJ/rZkDtFkVGbX1aOVa6q84W0CGY1qW95cgXJ5WPHI6s
FKQAegUKhdSrlDArcBZ7/q3C3ZM0ab8YNAYVKdpqIiIchKhrGEbbPrw7LfBLBSTH
SPgA237kC6jm5BIrbYszUgJf7C4Jp1VpvkC7Ll++4UfPn9xxmOWwy7zaxlS9eoO2
jk7mBkWJJYKbjSuSbOAqjjGC9vIOJ4LIayNS0clnDw7PF0vMpgLnjo8tddaKgT9k
ffDySMLLAgMBAAECggEAEe5YFjOamSkBj90g68LvwQHylZawIutb9ZaqnGhz1FNk
1Xxkcb+biRIXwmn5pol8v/kb+8RKeVxdWT01YCr9XVzE9z8V9YvMty6UKmwQukk8
xIgHf+R2E/dGiAzrF87/Rio9JGgPNQOwGXN1WCDd6UgsWMFbMrWkYmNBw1sGNLvn
hW02Sz/IXUyzsCCqtqUK4LGhQ2KMjj9twRzc5RWUCzLw0W7Byi1k0SIopaCI5Zz6
5U5RQxEVtH9qPGDJ8NRwsT7ShaDier7DcOhvIbXaXCfcf02h+7kYt5HHkwFnmkkR
qbFDlzsxWB1aUbVrvuGWac1M3BvEp5e92rpF0ZkUEQKBgQDbQS5Mp5iCgRu0xGuh
rZt/ADmZltMN4JfOXFS2At8BTADe54/BweS3IzblZr0SScChNPY27YqDsw5+WTcM
B3P8UULSVFox6oADnwpMAmi7L65z5D6B3gqL5OHR2U7gIA1kVAGL0psDUnZks61s
gN8oxlsM3AZe7GUnc2HC1v6dmwKBgQDRNUdZqUkll9VN3tOwmdwKZet4+64MF3te
tfO7BFmKgMxkxPi7t6cKVnHkjx+Xer0sEPrCanZgCLwtdFb2pKPn1/i3c7CnoUKW
boaa/w5xCTk0BoUzZnhxo2R3/SZMr/RMNgpC6nOartQsYN0trsCTYtjPD6jHBE2S
AA4MWQtakQKBgDErP9/O4eO6YmU6e0ypqypi+YfZDAGbsU+E4zZiFHKtAbD7SwDP
o6PyULhHPvVf9sPwJZsR0DNSr1hkV3TqIvednZefdQ6moQiu3NdI3wXDXqL8t4vW
KJVQwdeWnRqj9XzfXe1mUH8BOi3BIY4opGL3gKm0mfUlnFWpiW3xWu4rAoGAViA8
82iBuHw9UAV/2KA+ufkja3cRO+Ee5Oq7IC62PhKwEnwUehMtLVBRKurQ8qeQ4WdM
FGWHvhlafsv6USeOYo/C0KNMAnac1xlBSOXfqCFH72cPxw1UYFQHtG3/Kmr1g7pr
lwi19uQqbOqjo37hwMtcvkGQFf5rgMONBQBTcEECgYEAo8XPVDxumpD55sk5SOqN
sIxhnh8mOSD81IP3ts98yDvPC1fAvfz3QWOjl9wgZzIColiZP+scMZ/taexHKtVW
SC4xtNd+S5jdlWs5cWAd1pvZds/hbeGxwAocgGAYkYZbebUJSX9cvLOSQKrJd5HU
HnH7lWBy29m5tmGYigvaQMc=
-----END PRIVATE KEY-----

View File

@ -1,12 +1,12 @@
-----BEGIN X509 CRL-----
MIIBwDCBqQIBATANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjETMBEGA1UE
CAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3QxEDAOBgNV
BAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EXDTI1MDExNTA1NTk1MloY
DzIxMDcwMzA3MDU1OTUyWqAOMAwwCgYDVR0UBAMCAQEwDQYJKoZIhvcNAQELBQAD
ggEBAGyKNNyfKO5MOBoTWjYkZcnYmPefImHi6IuQ50AyU/DcUe+uaTe80mwuC5RZ
yFg7WjmLSmg/QvHz7zLJ2d+HV23wU8k2gLUxrnjsXIJAa20VVO/kp2Qip06/bveW
M9YZuToWwkx5oNIq6swzp3NX8SnRRKI3B4lqho7/R67OQg/B9fu0kQ9jfsNY+/e3
bNqGvfKrxhdlmo1bju6chx9pXsIRnMMG/os6yNAi6p6m/MH3botd/et1RcVrZdGk
CqAlZD3Tlt2mJEkWQbzQvitaZSEHyIRPUZKtkG5MaCQD5vsPGz3graxaMW8aCo9W
sI0uxjlBY7ULhgb5kaje+gnaI1w=
BAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EXDTI1MDIyNTEzNDIzN1oY
DzIxMDcwNDE3MTM0MjM3WqAOMAwwCgYDVR0UBAMCAQEwDQYJKoZIhvcNAQELBQAD
ggEBAMGYs05Oy+hQmLtABJ7WvvGUwlW3/HN0TmDIPo21vcZIbn5xtI3wuLF/Tl9S
E74u8RaLwnyP1j8ioFVQjZxDnugfUWEmFwWjiNkkXgASDmpnnyuP6Kv3wkw1Aqpb
Thlcjqi8HIcXKdJoOPrWIQtaBDh/0TRnXqFggyQErkwc4HfGAE9ZLmLFFqB33ze6
nNNyMecbSMYrKjlYKGYT2qzpp7oJMU+b0wLcdcJEdLcudRCg7GDfpcjIW+E83YSK
1AnRxpBiuk8JjsZOaXdTAfr0PI6HUeSd9kVRP5fF+EgMczKaM3wvZMpUtUqOhyCI
8nde+zlOYW1g7UCrALYohOX3mkI=
-----END X509 CRL-----

View File

@ -1,12 +1,12 @@
-----BEGIN X509 CRL-----
MIIB1jCBvwIBATANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjETMBEGA1UE
CAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3QxEDAOBgNV
BAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EXDTI1MDExNTA1NTk1MloY
DzIxMDcwMzA3MDU1OTUyWjAUMBICAQUXDTI1MDExNTA1NTk1MlqgDjAMMAoGA1Ud
FAQDAgECMA0GCSqGSIb3DQEBCwUAA4IBAQCHwH7vhm+9jGNZ7kj495wYdl95f4uq
/EapecfQIItM6CZy9SvSfrC2MIv1JzSlIhIWntfaTWYtnDW2vS1h4oR/5Xqd9Pkw
DlYEExOIB1NJm2pY5bZy0fTBhZat6jCiz1+5Rs3sAxkyxSYQy2Qyd5sQtVlGRPZy
lzuf74yZyTdPWtWUtP2NDR51guTL+lHrJN8IL1EseYefoT075XWdCVY+GysyVm6Z
WSQ6/2m6XqIoEf+ExLhB+5EegVbqK7XmbxphxX+rsFGM9ORLxGYdrp2RR+X1STLa
fj22+ovzI01ZgZ+b/JuNlZD0o1HbqesPgccVleB1hCUOM9HhEVWfTauY
BAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EXDTI1MDIyNTEzNDIzN1oY
DzIxMDcwNDE3MTM0MjM3WjAUMBICAQUXDTI1MDIyNTEzNDIzN1qgDjAMMAoGA1Ud
FAQDAgECMA0GCSqGSIb3DQEBCwUAA4IBAQDTvPnLWty3F+fAmhhqZQ1ZflGPtF3I
SHY+3dzpPbWsuZ1MSjBlKnYZr+ACqwP5M/1yJ/t5cqnUvPVw7oycKUXLiMOPIkTL
cGiBDgluKWhC3VKUsCJRWZ0CGY1kDed0Js1sBc4j3JNm5eGMxcDERAncW64ClOKc
L+ClVJ1JHjtoVwqxOS1PRVZLi8frC8pozUVBBBZ/wZTJcYtlz1shaIjCqlloHWNh
RPKVJ+NOUwsVlIhunCwI6QbCKxsXw0Fa9CP6PXMs5sNeW8zbruN6G9ofdK4sKg2K
pCvjOBUqRapRk7z89TKRM88whEtUKhB+ILb1NIpCq/Gc5NlH8sbAjrRQ
-----END X509 CRL-----

View File

@ -12,24 +12,24 @@ Certificate:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:97:a0:c8:2e:50:b0:14:d7:84:7e:f6:e8:cd:1b:
dd:3a:b9:ed:7d:a2:63:37:4b:e5:0f:26:a0:fb:27:
94:40:5c:a1:24:9a:28:15:5f:57:35:99:b5:7e:16:
16:fd:9e:4c:30:d8:de:09:81:4f:ce:ff:b2:dc:48:
9e:58:31:33:07:ce:9f:89:e8:30:c3:cc:3b:2e:3d:
63:88:21:9f:e3:4c:89:0a:46:35:45:cd:ad:5f:5e:
da:03:da:b7:21:e1:b8:70:3f:47:ed:1f:20:67:25:
d0:dc:c0:f2:c6:61:fa:e5:ca:28:ef:07:7a:79:d1:
a1:5a:f7:0d:cc:c8:31:b2:6c:a9:fe:78:8e:11:9a:
7e:26:07:76:b3:ec:cc:a1:d2:23:44:80:1a:85:05:
b1:c3:81:ea:c3:2c:21:09:8e:32:1f:3c:3a:60:dc:
c7:22:b8:04:1a:fd:73:e8:78:79:ea:88:69:4c:75:
5c:bc:d6:cb:9c:bc:65:5c:6f:65:59:78:a2:c3:00:
4e:90:36:da:27:cd:4a:10:68:0a:66:29:79:2d:85:
9e:b2:f4:e0:19:a3:b3:a7:f5:ab:6e:79:78:36:2b:
19:b8:0f:62:24:d9:6a:1e:c1:be:c0:14:d7:dd:5f:
fc:d5:0a:0d:e6:f7:c6:be:bd:4f:13:cf:18:0b:89:
bf:ab
00:cd:a9:03:cf:be:ed:03:a5:cc:a6:35:4d:25:61:
37:bd:42:3a:26:04:a2:29:17:14:26:3d:6e:01:2c:
f9:9d:20:4a:5f:16:c8:15:7a:7d:85:ae:1f:08:ff:
cd:90:27:19:19:49:99:c8:0d:4d:96:f9:de:0e:c8:
26:7c:d4:aa:84:e7:4d:9d:0f:44:46:af:c2:86:22:
f3:ca:1a:09:0d:98:3e:b1:1e:d7:aa:20:95:b4:15:
11:df:07:ee:ca:06:7d:f7:97:f3:7e:a2:e2:ba:ce:
25:32:a9:d4:96:17:07:c6:eb:d7:ed:ee:3a:94:e4:
66:a9:55:be:90:f5:09:5b:1a:b0:2f:b9:a5:96:6a:
3d:4c:68:07:fb:4d:df:f0:a0:d5:19:ea:24:75:d5:
a9:10:e5:ff:e1:08:44:a3:49:21:ec:7c:0d:c9:50:
52:fa:33:7a:dd:52:23:79:3b:52:38:cb:e4:bc:27:
65:23:0f:8f:df:eb:38:3c:21:9d:de:41:88:34:b7:
e2:90:03:74:79:dc:92:94:e1:71:4f:ff:b7:99:e6:
be:78:2f:ac:81:19:1e:48:1f:81:2b:f7:aa:cc:0b:
12:f9:64:41:5d:b1:c2:da:99:90:e5:67:51:ca:b3:
96:ef:b8:f5:15:82:0f:0f:d3:1a:dd:e1:7e:01:2d:
b0:db
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
@ -37,26 +37,26 @@ Certificate:
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
02:C4:11:7C:33:56:82:9C:B4:B8:4D:D3:BA:2D:17:62:7B:D5:07:62
52:53:B2:A2:BB:A7:6B:6E:1C:5B:2F:FA:ED:27:B1:E7:94:BB:E4:6E
X509v3 Authority Key Identifier:
53:48:5A:50:4D:78:80:6D:55:79:8A:FE:A9:A3:68:7A:04:9A:F0:87
32:41:09:D3:64:22:D3:E9:E0:07:DA:E3:D5:56:C8:44:61:46:DC:38
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
67:09:c5:63:8f:03:0d:ed:57:db:be:8d:46:5a:67:26:09:c3:
16:bb:19:40:b8:66:22:78:b3:fb:b5:0e:14:e8:9e:09:07:61:
a4:bf:5f:e5:af:38:2b:38:eb:a8:01:1f:1a:4e:a3:11:42:4d:
5d:5d:5f:55:86:fe:21:f1:ca:b4:26:de:3a:78:40:bb:f4:14:
b8:b6:36:ea:30:75:00:89:b6:f0:c4:91:8a:06:f7:72:bd:4e:
2f:2e:38:cf:a4:f0:59:ff:bd:83:17:25:65:68:54:de:39:b3:
b3:82:6a:f8:40:24:26:33:1b:b0:cd:53:99:66:ea:d3:f3:df:
6d:e0:9e:2f:7b:77:c7:4d:fa:8a:18:cb:25:34:88:f7:f0:75:
72:75:d9:fe:85:45:c3:c3:b3:40:3b:62:36:ca:39:2e:f2:bc:
dd:3e:eb:25:7e:6d:ac:db:d1:cc:54:39:dc:b8:5b:ef:19:c0:
5f:a0:49:f3:a2:13:24:21:80:73:58:a8:1b:ef:49:a7:c7:47:
49:78:a2:71:bd:a9:6d:c4:1f:cc:de:53:8e:16:f2:11:c1:9e:
03:c7:b4:b8:eb:85:02:90:5e:56:2c:df:22:f4:0c:c0:8d:9a:
7f:c0:86:c8:24:3c:05:36:34:2c:36:d0:f2:c8:6e:b9:b2:58:
b1:a1:a7:54
93:92:e2:4f:11:52:ea:df:aa:a3:69:66:dc:7f:36:53:5b:10:
c6:eb:75:2b:e2:25:0c:72:22:46:2f:19:d0:cc:d1:b9:19:0c:
93:77:91:7f:28:4d:3a:b3:06:94:f9:f0:49:14:7d:b2:12:60:
da:9f:24:59:5f:cd:eb:eb:16:44:f3:ba:47:96:10:71:f8:be:
37:66:a0:af:fc:f9:96:53:31:c3:53:1f:88:72:ff:6b:a4:18:
ec:55:a6:1c:bf:a8:af:8c:13:35:55:2d:aa:a2:26:c7:2c:1a:
55:aa:7a:12:11:eb:2d:fc:8c:6e:06:bb:d5:5b:f8:d1:25:bb:
38:6c:1a:54:68:d0:05:00:4c:9e:b3:db:5c:d1:85:3a:b3:0a:
ee:cd:33:1d:4c:d3:0c:e6:39:d1:a4:84:f3:57:f9:59:1e:75:
37:a9:26:82:37:f9:5c:6d:82:11:f6:25:94:74:32:c1:8f:d5:
19:b5:30:ec:dd:9b:aa:92:91:69:dd:25:e9:72:cf:37:7d:f3:
9c:d6:1c:e2:43:7f:bc:9c:08:6c:ed:b2:5a:76:d3:ac:bf:92:
7c:cd:47:f9:7d:59:1f:87:f4:97:ad:7b:48:00:a0:36:72:fc:
fb:0b:94:46:43:37:c0:81:8f:32:38:5c:e5:a0:12:bf:b9:2c:
91:ae:bf:76
-----BEGIN CERTIFICATE-----
MIID2TCCAsGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjET
MBEGA1UECAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3Qx
@ -64,19 +64,19 @@ EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMTIwODIw
MDAwMDAwWhcNMTIwODIxMDAwMDAwWjB+MQswCQYDVQQGEwJHQjEYMBYGA1UECAwP
Tm90dGluZ2hhbXNoaXJlMRMwEQYDVQQHDApOb3R0aW5naGFtMQ8wDQYDVQQKDAZT
ZXJ2ZXIxGzAZBgNVBAsMElByb2R1Y3Rpb24tZXhwaXJlZDESMBAGA1UEAwwJbG9j
YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl6DILlCwFNeE
fvbozRvdOrntfaJjN0vlDyag+yeUQFyhJJooFV9XNZm1fhYW/Z5MMNjeCYFPzv+y
3EieWDEzB86fiegww8w7Lj1jiCGf40yJCkY1Rc2tX17aA9q3IeG4cD9H7R8gZyXQ
3MDyxmH65coo7wd6edGhWvcNzMgxsmyp/niOEZp+Jgd2s+zModIjRIAahQWxw4Hq
wywhCY4yHzw6YNzHIrgEGv1z6Hh56ohpTHVcvNbLnLxlXG9lWXiiwwBOkDbaJ81K
EGgKZil5LYWesvTgGaOzp/Wrbnl4NisZuA9iJNlqHsG+wBTX3V/81QoN5vfGvr1P
E88YC4m/qwIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVu
U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUAsQRfDNWgpy0uE3T
ui0XYnvVB2IwHwYDVR0jBBgwFoAUU0haUE14gG1VeYr+qaNoegSa8IcwDQYJKoZI
hvcNAQELBQADggEBAGcJxWOPAw3tV9u+jUZaZyYJwxa7GUC4ZiJ4s/u1DhTongkH
YaS/X+WvOCs466gBHxpOoxFCTV1dX1WG/iHxyrQm3jp4QLv0FLi2NuowdQCJtvDE
kYoG93K9Ti8uOM+k8Fn/vYMXJWVoVN45s7OCavhAJCYzG7DNU5lm6tPz323gni97
d8dN+ooYyyU0iPfwdXJ12f6FRcPDs0A7YjbKOS7yvN0+6yV+bazb0cxUOdy4W+8Z
wF+gSfOiEyQhgHNYqBvvSafHR0l4onG9qW3EH8zeU44W8hHBngPHtLjrhQKQXlYs
3yL0DMCNmn/AhsgkPAU2NCw20PLIbrmyWLGhp1Q=
YWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzakDz77tA6XM
pjVNJWE3vUI6JgSiKRcUJj1uASz5nSBKXxbIFXp9ha4fCP/NkCcZGUmZyA1Nlvne
DsgmfNSqhOdNnQ9ERq/ChiLzyhoJDZg+sR7XqiCVtBUR3wfuygZ995fzfqLius4l
MqnUlhcHxuvX7e46lORmqVW+kPUJWxqwL7mllmo9TGgH+03f8KDVGeokddWpEOX/
4QhEo0kh7HwNyVBS+jN63VIjeTtSOMvkvCdlIw+P3+s4PCGd3kGINLfikAN0edyS
lOFxT/+3mea+eC+sgRkeSB+BK/eqzAsS+WRBXbHC2pmQ5WdRyrOW77j1FYIPD9Ma
3eF+AS2w2wIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVu
U1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUUlOyoruna24cWy/6
7Sex55S75G4wHwYDVR0jBBgwFoAUMkEJ02Qi0+ngB9rj1VbIRGFG3DgwDQYJKoZI
hvcNAQELBQADggEBAJOS4k8RUurfqqNpZtx/NlNbEMbrdSviJQxyIkYvGdDM0bkZ
DJN3kX8oTTqzBpT58EkUfbISYNqfJFlfzevrFkTzukeWEHH4vjdmoK/8+ZZTMcNT
H4hy/2ukGOxVphy/qK+MEzVVLaqiJscsGlWqehIR6y38jG4Gu9Vb+NEluzhsGlRo
0AUATJ6z21zRhTqzCu7NMx1M0wzmOdGkhPNX+VkedTepJoI3+VxtghH2JZR0MsGP
1Rm1MOzdm6qSkWndJelyzzd985zWHOJDf7ycCGztslp206y/knzNR/l9WR+H9Jet
e0gAoDZy/PsLlEZDN8CBjzI4XOWgEr+5LJGuv3Y=
-----END CERTIFICATE-----

View File

@ -1,28 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCXoMguULAU14R+
9ujNG906ue19omM3S+UPJqD7J5RAXKEkmigVX1c1mbV+Fhb9nkww2N4JgU/O/7Lc
SJ5YMTMHzp+J6DDDzDsuPWOIIZ/jTIkKRjVFza1fXtoD2rch4bhwP0ftHyBnJdDc
wPLGYfrlyijvB3p50aFa9w3MyDGybKn+eI4Rmn4mB3az7Myh0iNEgBqFBbHDgerD
LCEJjjIfPDpg3MciuAQa/XPoeHnqiGlMdVy81sucvGVcb2VZeKLDAE6QNtonzUoQ
aApmKXkthZ6y9OAZo7On9atueXg2Kxm4D2Ik2Woewb7AFNfdX/zVCg3m98a+vU8T
zxgLib+rAgMBAAECggEAAoOuuE79C8lAChYKuz9FRPBx6FfYV/vPbrq/8I6ggoDm
ukZWg+plmQ1bJ+PJy4oMgx/DVzGln+391ivzBJ6OyZPDt5nc3j6yh/24hqz4bmCi
2U8tMW50e8Y/Y+hV/kfL0CM+r1L9llbXbJhEJaLYw5VgfZOxN0nW3NRB3+rJCgGz
v5Zdsw6C7bYXuLJwep5SsmSOg5qcaVioti2pfYxX/uzcbSqPvvYHatkcot56vQmp
vQABzmJ/ppFb4QAqP+A8abCDm2HT1kTymC8ztuz9HjCGRpxJ1QiRkc05U4/hnQja
CgMp8jZkm+VHRKxNw2i2jGN0aJ4RZT07wQXKfiRmNQKBgQDRRfePDJfMDRpJCr1Q
e7+zW8plzvSjmdW6ophbHkK0sUj3pt1bPBfF5LAYb6AYoI/LEH9KCg6e545R7w/S
ngJMu1reFzwGOj6ALx8bdo2jW7dH0XDorNzTaNuBWaQIgdEt8AAf/WF+mf+Ir6mh
FBsbLYkZJr7gkCcR2UHr83FoXwKBgQC5e9H+ScxAsqKNyWXbmd/5d8ulRrwyVM5n
zO4BnbpKAN3AqLKYm+56Pp1l11d7aR7SIwJQc4QOsLk3+NtzaiIeoGnOFBnGFQLg
cPXIej3IdS0QYnVrCoSrizRd9HhkRzskRd1vw55FzGqxuRsCmjdYx+R5bdMc41PH
4YrFK5NcNQKBgQDEfatJVwuX/Z12g2zpiqed4kuRd9XfXmt9B3mB5FHBksvuK3Cf
Xzb7ChQFfZmWRft9MIoznGnJ7aSFba8vlEiYfzl8Wdh0CG/yr0vH33JxtYXLGu2m
qdfVcBjZxK7theY/+Z5EawYFdtalIjplEZm51PFq+iQyeWcVrSXmQvdyhQKBgQCK
cVTnzAVcNPkHg083fb6i4Ttq/UTy/EGjUF5FbojhO4xIhKHpLlntfFbW8MgnIOsU
RXUwv0fN/zIACQsjNhCJc4oFexNRudUP2MBbBoKe4HbmR9cEMjGcKKbJifNiRZhr
FoqVJRk5V747MMJsStcMuQZbbBGq+jJKepmtWT0AEQKBgFr0BAqUsyGaD0FYTE8e
56YNYYkJpm+QSqvvufAi5PgKmV8L883uW6qp/eJdDJf5/Hxi0zxZR3lH5u0GxQoI
YamhbnqfT783bO4Yo+mqVPX1e8Ynk4XdIAQ/q17FP9AxPQbXZ9EQ/9zQ8/99Sq/j
J5n3BN38aQcM7UtuRhw7Kv81
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDNqQPPvu0Dpcym
NU0lYTe9QjomBKIpFxQmPW4BLPmdIEpfFsgVen2Frh8I/82QJxkZSZnIDU2W+d4O
yCZ81KqE502dD0RGr8KGIvPKGgkNmD6xHteqIJW0FRHfB+7KBn33l/N+ouK6ziUy
qdSWFwfG69ft7jqU5GapVb6Q9QlbGrAvuaWWaj1MaAf7Td/woNUZ6iR11akQ5f/h
CESjSSHsfA3JUFL6M3rdUiN5O1I4y+S8J2UjD4/f6zg8IZ3eQYg0t+KQA3R53JKU
4XFP/7eZ5r54L6yBGR5IH4Er96rMCxL5ZEFdscLamZDlZ1HKs5bvuPUVgg8P0xrd
4X4BLbDbAgMBAAECggEABAwNE3vUsDCwEUk/5mS+XbloPt1Hz6Uw8/uw0XxwFmPP
SDBrlDif2w9CdGvhlgee79IfS5eEwlwnvtoOH9YThkqtn/yalwWDFMlVS3yDAcMl
i1i/B7hdGc5xq+uSYGQLpeFV8lUEPzF/++Tpq7ZyTxDPDqiUezTvbD+lYLbhuJWJ
1TdPPoWTcVZXrw8dubdgWYsDniF8IKcBoBeV8vx8Umx7lT+aohdxpHoMnqhR0U4L
k4PHJUFTkDtuS+6fPhePimDc7kTDzDpTsQAi/3gkbfCbM0Z7hX65TZCjv2/XD5GT
TOzLqi6ZvvORCCi/u7lmI+Mgrt5phdditLxVEbJU8QKBgQDpKvAfOizHgS8E42Mj
Z6NSmOAXCOJiY8z7PZwBm6FZpoTsuf4JvtVAdXw1o0a4YgxaC35QYjupRu4t/4Oe
oD6Drm/mNsIi40OTWogBW0pbwhGn5bz/E/PBtSG1zaM7uK/1gHZQL7OrQmk0v6sq
J8PhlitkysprFbpcnbFwkkx4QwKBgQDhzIRa7A59FuTo4LUNOdWZFT9I8nRy6iSs
rtPv8Wc1VZ6YrUqAeb+L33Xm0GjUAgxzjYWM+Nf5FGQW3mlcEKkJkLi9MwFBgtrq
UgFNoJUW4XxUmBGmnZj+0w1p9JxTI1/WxdzR9As1ILIM7w7zeBmedySCdrMQPe+c
alQWB3KHiQKBgHYP58XoDwR1xPkUqf4jW+9WuSDwvrBTGFeeun+V7f0W8/dptdf5
aMFau6ntIsH544c0iqDpHIx5/eAMoPiQ6xaCHObUkzhXGsBh9ru5Hc2YVphNG4WM
9MAAlzEXDrAOtAn7Ie04OiFdXyf2ZRTTTbvL7ez7QcM3HUYIEvCNI2tBAoGAM4aC
8WiKidruk4GrbwAykMM7dL72+b4abllavZc9sPr/vOFWbejaX+W3Ntt6AF8TTk8O
GbQzPIB9soZATqTynd8reOkpsTRWFkBuUbOCMf10bK1i4b12yzeICRSrk4Ev/oea
M0LYR+BVIQRwSfivB+0yJJ9Hjz5C7lOJKpm6ddkCgYEAhLG+idT01/DOf0ttcizn
COsGdeQGEvd9/LEQln8JI5CW39K+JfwfJapeJ5Wv8shHLwz+HVlypXFTKHZK215L
f/WO+bvmDu1NunHIgH6cTGFSkpTANRlylQSosRNLAh/zBPSVWeLQVN2vAjoZ/nvB
OKG/b/+LDZa5X4IoFZV9lzs=
-----END PRIVATE KEY-----

View File

@ -5,31 +5,31 @@ Certificate:
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=GB, ST=Derbyshire, O=Mosquitto Project, OU=Testing, CN=Signing CA
Validity
Not Before: Jan 15 05:59:52 2025 GMT
Not After : Jan 14 05:59:52 2030 GMT
Not Before: Feb 25 13:42:37 2025 GMT
Not After : Feb 24 13:42:37 2030 GMT
Subject: C=GB, ST=Nottinghamshire, L=Nottingham, O=Server, OU=Production, CN=localhost
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:d8:aa:9a:e7:2c:34:1e:70:b4:57:9b:1f:fa:28:
e7:65:84:dc:a4:13:ce:b4:26:9e:e1:f3:59:bd:97:
dc:43:ff:19:40:a4:87:a6:f2:29:c1:a8:76:dc:f1:
f3:bf:18:31:7a:0e:d3:50:ad:fd:e7:a6:d4:4d:81:
9b:99:45:62:e4:ee:c6:3b:42:7a:2b:19:5b:00:f2:
e9:5d:04:ff:86:eb:7b:9a:ff:68:74:00:73:1d:62:
53:76:02:dc:51:6e:86:b0:68:c9:93:bf:de:df:80:
fa:e0:9f:e3:28:78:47:ec:f7:f6:bb:f2:ca:24:15:
f8:ab:4e:34:af:f7:4c:44:db:63:24:fe:e9:1b:34:
81:05:43:1c:62:bf:75:9e:ef:a0:6f:1d:0c:56:57:
0a:72:e7:d4:28:ad:75:92:9a:90:92:52:8f:5f:d1:
65:43:b6:13:cc:09:09:4c:e5:96:88:73:1b:fe:bf:
43:83:41:0c:03:dc:8d:31:ff:97:f8:03:5c:af:0b:
e5:60:7b:46:cc:a3:7c:e8:26:d7:19:ed:af:4f:b2:
fb:aa:d8:95:eb:8d:b4:e4:3b:10:08:0c:13:7b:77:
ac:2f:33:b7:bd:53:07:03:b1:b7:05:07:c2:a7:d8:
4c:c5:1c:d4:f6:cd:db:48:03:fe:e4:0f:91:b1:a1:
80:31
00:af:6d:36:10:72:79:73:45:9e:07:a3:f2:8d:28:
c8:03:63:15:7f:11:15:0f:1b:34:e7:e0:cf:56:9d:
7d:3b:7c:5a:6b:f3:15:c0:90:09:d4:2b:0c:44:6c:
4a:f0:0d:cf:28:60:1e:81:ac:e7:d3:66:e7:5c:de:
95:75:d3:99:93:01:42:31:7c:50:d4:9e:6e:22:b3:
1b:c9:0f:e5:33:4d:ad:17:f0:9c:20:69:57:1e:e8:
15:bd:cf:7f:08:8a:68:14:9d:3e:ef:25:0a:5e:3d:
34:c7:5b:30:fa:65:fa:0f:d2:80:b9:11:8e:dd:c2:
85:3f:93:83:88:15:5d:66:6f:9c:8e:67:08:cf:61:
53:d4:dd:f6:01:04:ee:32:d5:38:98:9d:d5:b2:ca:
ec:ff:a1:b6:08:79:a5:3c:66:81:fe:96:b5:01:67:
33:ce:b3:7d:e9:e5:fe:b2:de:9a:e8:b0:18:d3:25:
80:37:f4:d7:dc:33:79:85:1b:18:bc:ac:59:61:e7:
30:46:c2:75:f9:ba:54:39:0e:39:67:b7:42:04:c7:
ac:84:a8:cd:33:f9:b8:05:d5:ff:bf:ac:5e:dd:1a:
2e:e2:83:f4:49:b3:62:c0:d7:29:a2:be:4b:6e:6d:
ed:cf:0b:90:39:04:65:66:5f:82:19:4b:d0:da:db:
a4:ef
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
@ -37,46 +37,46 @@ Certificate:
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
DA:E3:8E:FA:E2:50:AD:B5:CD:35:F2:AA:5D:C7:62:10:00:7F:54:E7
D3:87:2B:89:AE:E5:87:47:2B:FD:59:80:FD:FD:05:0A:75:D2:40:45
X509v3 Authority Key Identifier:
53:48:5A:50:4D:78:80:6D:55:79:8A:FE:A9:A3:68:7A:04:9A:F0:87
32:41:09:D3:64:22:D3:E9:E0:07:DA:E3:D5:56:C8:44:61:46:DC:38
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
14:27:33:81:d2:ec:f2:2c:8c:df:95:bd:e7:93:25:c8:5e:da:
1b:be:55:dc:38:63:c0:d2:cf:cd:45:09:89:e3:69:c7:3a:cb:
02:17:44:c9:dd:87:c3:5a:ea:a2:e6:dd:f1:98:ef:8d:c5:ee:
c8:1c:a4:21:09:10:aa:bf:5c:95:f0:59:d4:a1:92:6e:81:0f:
80:82:c1:d0:7f:fe:12:0f:d7:13:65:68:ac:a5:37:ae:b2:45:
06:8b:a4:32:2f:3c:26:c9:a8:f0:d8:de:64:29:44:dd:6b:19:
95:30:71:ed:eb:52:18:65:3f:2b:57:44:61:5e:9e:e9:a2:ca:
04:46:e5:71:db:e6:69:63:31:40:2c:e0:ad:e4:89:1b:81:90:
d7:4c:ed:0f:2b:4a:58:56:d4:40:42:26:f4:8a:82:bf:cc:94:
2e:02:61:2c:f8:e2:ad:b9:f8:6e:a5:fc:79:df:15:67:8a:6d:
dc:98:ea:19:25:5a:13:0f:e2:ec:db:d2:84:33:82:dd:f9:af:
b0:92:0f:f7:1c:e4:54:18:0c:6a:3e:82:a7:c9:f0:01:6f:cf:
23:70:5e:d1:9d:d6:1c:79:f0:a1:9b:ba:94:58:fc:57:1c:ba:
ab:46:1c:9f:d8:97:26:e7:f6:10:dd:02:a6:cb:d2:ec:23:ec:
cd:ea:31:0b
dc:03:9f:a9:7a:87:12:17:1a:d0:05:c6:41:07:d7:00:b7:10:
e1:63:90:ae:43:b4:d6:a4:cf:6d:80:ef:a2:2c:0a:f9:af:61:
b0:c5:f9:6f:fc:98:0f:a6:e5:d6:a4:14:00:39:5a:29:12:db:
9a:ac:8b:f6:b9:5a:2e:0c:40:52:b9:c2:2f:76:a5:33:17:4d:
42:42:5b:50:50:79:be:73:a9:be:85:33:88:bf:61:67:4c:aa:
fa:6b:1e:d8:69:5a:bf:94:ca:24:af:8b:b9:cd:c4:97:cf:a3:
28:34:94:58:5e:ed:ee:77:a8:fb:ad:72:d5:a3:c4:20:91:63:
9a:01:dc:26:e2:ce:1e:c5:2e:e6:14:33:b8:da:e9:3b:92:2c:
3b:1b:49:ab:36:2f:12:fa:4d:e9:89:e0:7b:f2:76:28:0c:3e:
48:b7:92:52:eb:dd:f9:bd:15:09:a7:5c:0c:05:27:e3:1f:5d:
bc:0b:95:4e:59:5d:5a:06:e1:ea:7f:0a:a2:29:0b:1a:d5:40:
be:cd:9a:64:8d:e8:0f:15:b0:0d:fc:02:8d:37:ee:a3:06:d1:
94:df:e3:0d:77:c2:1e:99:f6:3f:ed:ad:db:5d:7d:e0:7b:7e:
cf:b7:c3:12:51:0e:ba:e9:0f:d0:14:fa:bf:e5:56:70:27:e2:
6c:24:72:d2
-----BEGIN CERTIFICATE-----
MIID0TCCArmgAwIBAgIBATANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJHQjET
MBEGA1UECAwKRGVyYnlzaGlyZTEaMBgGA1UECgwRTW9zcXVpdHRvIFByb2plY3Qx
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMTE1
MDU1OTUyWhcNMzAwMTE0MDU1OTUyWjB2MQswCQYDVQQGEwJHQjEYMBYGA1UECAwP
EDAOBgNVBAsMB1Rlc3RpbmcxEzARBgNVBAMMClNpZ25pbmcgQ0EwHhcNMjUwMjI1
MTM0MjM3WhcNMzAwMjI0MTM0MjM3WjB2MQswCQYDVQQGEwJHQjEYMBYGA1UECAwP
Tm90dGluZ2hhbXNoaXJlMRMwEQYDVQQHDApOb3R0aW5naGFtMQ8wDQYDVQQKDAZT
ZXJ2ZXIxEzARBgNVBAsMClByb2R1Y3Rpb24xEjAQBgNVBAMMCWxvY2FsaG9zdDCC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANiqmucsNB5wtFebH/oo52WE
3KQTzrQmnuHzWb2X3EP/GUCkh6byKcGodtzx878YMXoO01Ct/eem1E2Bm5lFYuTu
xjtCeisZWwDy6V0E/4bre5r/aHQAcx1iU3YC3FFuhrBoyZO/3t+A+uCf4yh4R+z3
9rvyyiQV+KtONK/3TETbYyT+6Rs0gQVDHGK/dZ7voG8dDFZXCnLn1CitdZKakJJS
j1/RZUO2E8wJCUzllohzG/6/Q4NBDAPcjTH/l/gDXK8L5WB7RsyjfOgm1xntr0+y
+6rYleuNtOQ7EAgME3t3rC8zt71TBwOxtwUHwqfYTMUc1PbN20gD/uQPkbGhgDEC
ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK9tNhByeXNFngej8o0oyANj
FX8RFQ8bNOfgz1adfTt8WmvzFcCQCdQrDERsSvANzyhgHoGs59Nm51zelXXTmZMB
QjF8UNSebiKzG8kP5TNNrRfwnCBpVx7oFb3PfwiKaBSdPu8lCl49NMdbMPpl+g/S
gLkRjt3ChT+Tg4gVXWZvnI5nCM9hU9Td9gEE7jLVOJid1bLK7P+htgh5pTxmgf6W
tQFnM86zfenl/rLemuiwGNMlgDf019wzeYUbGLysWWHnMEbCdfm6VDkOOWe3QgTH
rISozTP5uAXV/7+sXt0aLuKD9EmzYsDXKaK+S25t7c8LkDkEZWZfghlL0NrbpO8C
AwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5l
cmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNrjjvriUK21zTXyql3HYhAAf1Tn
MB8GA1UdIwQYMBaAFFNIWlBNeIBtVXmK/qmjaHoEmvCHMA0GCSqGSIb3DQEBCwUA
A4IBAQAUJzOB0uzyLIzflb3nkyXIXtobvlXcOGPA0s/NRQmJ42nHOssCF0TJ3YfD
Wuqi5t3xmO+Nxe7IHKQhCRCqv1yV8FnUoZJugQ+AgsHQf/4SD9cTZWispTeuskUG
i6QyLzwmyajw2N5kKUTdaxmVMHHt61IYZT8rV0RhXp7posoERuVx2+ZpYzFALOCt
5IkbgZDXTO0PK0pYVtRAQib0ioK/zJQuAmEs+OKtufhupfx53xVnim3cmOoZJVoT
D+Ls29KEM4Ld+a+wkg/3HORUGAxqPoKnyfABb88jcF7RndYcefChm7qUWPxXHLqr
Rhyf2Jcm5/YQ3QKmy9LsI+zN6jEL
cmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFNOHK4mu5YdHK/1ZgP39BQp10kBF
MB8GA1UdIwQYMBaAFDJBCdNkItPp4Afa49VWyERhRtw4MA0GCSqGSIb3DQEBCwUA
A4IBAQDcA5+peocSFxrQBcZBB9cAtxDhY5CuQ7TWpM9tgO+iLAr5r2Gwxflv/JgP
puXWpBQAOVopEtuarIv2uVouDEBSucIvdqUzF01CQltQUHm+c6m+hTOIv2FnTKr6
ax7YaVq/lMokr4u5zcSXz6MoNJRYXu3ud6j7rXLVo8QgkWOaAdwm4s4exS7mFDO4
2uk7kiw7G0mrNi8S+k3pieB78nYoDD5It5JS6935vRUJp1wMBSfjH128C5VOWV1a
BuHqfwqiKQsa1UC+zZpkjegPFbAN/AKNN+6jBtGU3+MNd8IemfY/7a3bXX3ge37P
t8MSUQ666Q/QFPq/5VZwJ+JsJHLS
-----END CERTIFICATE-----

Some files were not shown because too many files have changed in this diff Show More