From d0fe048092ac28fa5bdc305c98e62ae44fb51497 Mon Sep 17 00:00:00 2001 From: buildmaster Date: Fri, 28 Jun 2019 15:48:50 +0000 Subject: [PATCH] Sync docs from 2.1.x to gh-pages --- 2.1.x/css/highlight.css | 20 +- 2.1.x/css/manual-multipage.css | 2 +- 2.1.x/css/manual-singlepage.css | 2 +- 2.1.x/css/manual.css | 362 +++++++++--------- 2.1.x/index.html | 2 +- 2.1.x/multi/css/highlight.css | 20 +- 2.1.x/multi/css/manual-multipage.css | 2 +- 2.1.x/multi/css/manual-singlepage.css | 2 +- 2.1.x/multi/css/manual.css | 362 +++++++++--------- 2.1.x/multi/multi__client_side_usage.html | 20 +- 2.1.x/multi/multi__quick_start.html | 24 +- .../multi_vault.config.authentication.html | 14 +- ...ulti_vault.config.backends.configurer.html | 2 +- ...ult.config.backends.database-backends.html | 2 +- 2.1.x/multi/multi_vault.config.backends.html | 6 +- 2.1.x/single/css/highlight.css | 20 +- 2.1.x/single/css/manual-multipage.css | 2 +- 2.1.x/single/css/manual-singlepage.css | 2 +- 2.1.x/single/css/manual.css | 362 +++++++++--------- 2.1.x/single/spring-cloud-vault.html | 68 ++-- 20 files changed, 645 insertions(+), 651 deletions(-) diff --git a/2.1.x/css/highlight.css b/2.1.x/css/highlight.css index ffefef72..3850f8b9 100644 --- a/2.1.x/css/highlight.css +++ b/2.1.x/css/highlight.css @@ -4,32 +4,32 @@ */ .hl-keyword { - color: #7F0055; - font-weight: bold; + color: #7F0055; + font-weight: bold; } .hl-comment { - color: #3F5F5F; - font-style: italic; + color: #3F5F5F; + font-style: italic; } .hl-multiline-comment { - color: #3F5FBF; - font-style: italic; + color: #3F5FBF; + font-style: italic; } .hl-tag { - color: #3F7F7F; + color: #3F7F7F; } .hl-attribute { - color: #7F007F; + color: #7F007F; } .hl-value { - color: #2A00FF; + color: #2A00FF; } .hl-string { - color: #2A00FF; + color: #2A00FF; } \ No newline at end of file diff --git a/2.1.x/css/manual-multipage.css b/2.1.x/css/manual-multipage.css index 0c484531..b790654b 100644 --- a/2.1.x/css/manual-multipage.css +++ b/2.1.x/css/manual-multipage.css @@ -1,7 +1,7 @@ @IMPORT url("manual.css"); body.firstpage { - background: url("../images/background.png") no-repeat center top; + background: url("../images/background.png") no-repeat center top; } div.part h1 { diff --git a/2.1.x/css/manual-singlepage.css b/2.1.x/css/manual-singlepage.css index 4a7fd140..303192a8 100644 --- a/2.1.x/css/manual-singlepage.css +++ b/2.1.x/css/manual-singlepage.css @@ -1,6 +1,6 @@ @IMPORT url("manual.css"); body { - background: url("../images/background.png") no-repeat center top; + background: url("../images/background.png") no-repeat center top; } diff --git a/2.1.x/css/manual.css b/2.1.x/css/manual.css index 0ecbe2e8..20cf07da 100644 --- a/2.1.x/css/manual.css +++ b/2.1.x/css/manual.css @@ -1,344 +1,342 @@ @IMPORT url("highlight.css"); html { - padding: 0pt; - margin: 0pt; + padding: 0pt; + margin: 0pt; } body { - color: #333333; - margin: 15px 30px; - font-family: Helvetica, Arial, Freesans, Clean, Sans-serif; - line-height: 1.6; - -webkit-font-smoothing: antialiased; + color: #333333; + margin: 15px 30px; + font-family: Helvetica, Arial, Freesans, Clean, Sans-serif; + line-height: 1.6; + -webkit-font-smoothing: antialiased; } code { - font-size: 16px; - font-family: Consolas, "Liberation Mono", Courier, monospace; + font-size: 16px; + font-family: Consolas, "Liberation Mono", Courier, monospace; } -:not(a)>code { - color: #6D180B; +:not(a) > code { + color: #6D180B; } -:not(pre)>code { - background-color: #F2F2F2; - border: 1px solid #CCCCCC; - border-radius: 4px; - padding: 1px 3px 0; - text-shadow: none; - white-space: nowrap; +:not(pre) > code { + background-color: #F2F2F2; + border: 1px solid #CCCCCC; + border-radius: 4px; + padding: 1px 3px 0; + text-shadow: none; + white-space: nowrap; } -body>*:first-child { - margin-top: 0 !important; +body > *:first-child { + margin-top: 0 !important; } div { - margin: 0pt; + margin: 0pt; } hr { - border: 1px solid #CCCCCC; - background: #CCCCCC; + border: 1px solid #CCCCCC; + background: #CCCCCC; } -h1,h2,h3,h4,h5,h6 { - color: #000000; - cursor: text; - font-weight: bold; - margin: 30px 0 10px; - padding: 0; +h1, h2, h3, h4, h5, h6 { + color: #000000; + cursor: text; + font-weight: bold; + margin: 30px 0 10px; + padding: 0; } -h1,h2,h3 { - margin: 40px 0 10px; +h1, h2, h3 { + margin: 40px 0 10px; } h1 { - margin: 70px 0 30px; - padding-top: 20px; + margin: 70px 0 30px; + padding-top: 20px; } div.part h1 { - border-top: 1px dotted #CCCCCC; + border-top: 1px dotted #CCCCCC; } -h1,h1 code { - font-size: 32px; +h1, h1 code { + font-size: 32px; } -h2,h2 code { - font-size: 24px; +h2, h2 code { + font-size: 24px; } -h3,h3 code { - font-size: 20px; +h3, h3 code { + font-size: 20px; } -h4,h1 code,h5,h5 code,h6,h6 code { - font-size: 18px; +h4, h1 code, h5, h5 code, h6, h6 code { + font-size: 18px; } -div.book,div.chapter,div.appendix,div.part,div.preface { - min-width: 300px; - max-width: 1200px; - margin: 0 auto; +div.book, div.chapter, div.appendix, div.part, div.preface { + min-width: 300px; + max-width: 1200px; + margin: 0 auto; } p.releaseinfo { - font-weight: bold; - margin-bottom: 40px; - margin-top: 40px; + font-weight: bold; + margin-bottom: 40px; + margin-top: 40px; } div.authorgroup { - line-height: 1; + line-height: 1; } p.copyright { - line-height: 1; - margin-bottom: -5px; + line-height: 1; + margin-bottom: -5px; } .legalnotice p { - font-style: italic; - font-size: 14px; - line-height: 1; + font-style: italic; + font-size: 14px; + line-height: 1; } -div.titlepage+p,div.titlepage+p { - margin-top: 0; +div.titlepage + p, div.titlepage + p { + margin-top: 0; } pre { - line-height: 1.0; - color: black; + line-height: 1.0; + color: black; } a { - color: #4183C4; - text-decoration: none; + color: #4183C4; + text-decoration: none; } p { - margin: 15px 0; - text-align: left; + margin: 15px 0; + text-align: left; } -ul,ol { - padding-left: 30px; +ul, ol { + padding-left: 30px; } li p { - margin: 0; + margin: 0; } div.table { - margin: 1em; - padding: 0.5em; - text-align: center; + margin: 1em; + padding: 0.5em; + text-align: center; } -div.table table,div.informaltable table { - display: table; - width: 100%; +div.table table, div.informaltable table { + display: table; + width: 100%; } div.table td { - padding-left: 7px; - padding-right: 7px; + padding-left: 7px; + padding-right: 7px; } .sidebar { - line-height: 1.4; - padding: 0 20px; - background-color: #F8F8F8; - border: 1px solid #CCCCCC; - border-radius: 3px 3px 3px 3px; + line-height: 1.4; + padding: 0 20px; + background-color: #F8F8F8; + border: 1px solid #CCCCCC; + border-radius: 3px 3px 3px 3px; } .sidebar p.title { - color: #6D180B; + color: #6D180B; } -pre.programlisting,pre.screen { - font-size: 15px; - padding: 6px 10px; - background-color: #F8F8F8; - border: 1px solid #CCCCCC; - border-radius: 3px 3px 3px 3px; - clear: both; - overflow: auto; - line-height: 1.4; - font-family: Consolas, "Liberation Mono", Courier, monospace; +pre.programlisting, pre.screen { + font-size: 15px; + padding: 6px 10px; + background-color: #F8F8F8; + border: 1px solid #CCCCCC; + border-radius: 3px 3px 3px 3px; + clear: both; + overflow: auto; + line-height: 1.4; + font-family: Consolas, "Liberation Mono", Courier, monospace; } table { - border-collapse: collapse; - border-spacing: 0; - border: 1px solid #DDDDDD !important; - border-radius: 4px !important; - border-collapse: separate !important; - line-height: 1.6; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid #DDDDDD !important; + border-radius: 4px !important; + border-collapse: separate !important; + line-height: 1.6; } table thead { - background: #F5F5F5; + background: #F5F5F5; } table tr { - border: none; - border-bottom: none; + border: none; + border-bottom: none; } table th { - font-weight: bold; + font-weight: bold; } -table th,table td { - border: none !important; - padding: 6px 13px; +table th, table td { + border: none !important; + padding: 6px 13px; } table tr:nth-child(2n) { - background-color: #F8F8F8; + background-color: #F8F8F8; } td p { - margin: 0 0 15px 0; + margin: 0 0 15px 0; } div.table-contents td p { - margin: 0; + margin: 0; } -div.important *,div.note *,div.tip *,div.warning *,div.navheader *,div.navfooter *,div.calloutlist * - { - border: none !important; - background: none !important; - margin: 0; +div.important *, div.note *, div.tip *, div.warning *, div.navheader *, div.navfooter *, div.calloutlist * { + border: none !important; + background: none !important; + margin: 0; } -div.important p,div.note p,div.tip p,div.warning p { - color: #6F6F6F; - line-height: 1.6; +div.important p, div.note p, div.tip p, div.warning p { + color: #6F6F6F; + line-height: 1.6; } -div.important code,div.note code,div.tip code,div.warning code { - background-color: #F2F2F2 !important; - border: 1px solid #CCCCCC !important; - border-radius: 4px !important; - padding: 1px 3px 0 !important; - text-shadow: none !important; - white-space: nowrap !important; +div.important code, div.note code, div.tip code, div.warning code { + background-color: #F2F2F2 !important; + border: 1px solid #CCCCCC !important; + border-radius: 4px !important; + padding: 1px 3px 0 !important; + text-shadow: none !important; + white-space: nowrap !important; } -.note th,.tip th,.warning th { - display: none; +.note th, .tip th, .warning th { + display: none; } -.note tr:first-child td,.tip tr:first-child td,.warning tr:first-child td - { - border-right: 1px solid #CCCCCC !important; - padding-top: 10px; +.note tr:first-child td, .tip tr:first-child td, .warning tr:first-child td { + border-right: 1px solid #CCCCCC !important; + padding-top: 10px; } -div.calloutlist p,div.calloutlist td { - padding: 0; - margin: 0; +div.calloutlist p, div.calloutlist td { + padding: 0; + margin: 0; } -div.calloutlist>table>tbody>tr>td:first-child { - padding-left: 10px; - width: 30px !important; +div.calloutlist > table > tbody > tr > td:first-child { + padding-left: 10px; + width: 30px !important; } -div.important,div.note,div.tip,div.warning { - margin-left: 0px !important; - margin-right: 20px !important; - margin-top: 20px; - margin-bottom: 20px; - padding-top: 10px; - padding-bottom: 10px; +div.important, div.note, div.tip, div.warning { + margin-left: 0px !important; + margin-right: 20px !important; + margin-top: 20px; + margin-bottom: 20px; + padding-top: 10px; + padding-bottom: 10px; } div.toc { - line-height: 1.2; + line-height: 1.2; } -dl,dt { - margin-top: 1px; - margin-bottom: 0; +dl, dt { + margin-top: 1px; + margin-bottom: 0; } -div.toc>dl>dt { - font-size: 32px; - font-weight: bold; - margin: 30px 0 10px 0; - display: block; +div.toc > dl > dt { + font-size: 32px; + font-weight: bold; + margin: 30px 0 10px 0; + display: block; } -div.toc>dl>dd>dl>dt { - font-size: 24px; - font-weight: bold; - margin: 20px 0 10px 0; - display: block; +div.toc > dl > dd > dl > dt { + font-size: 24px; + font-weight: bold; + margin: 20px 0 10px 0; + display: block; } -div.toc>dl>dd>dl>dd>dl>dt { - font-weight: bold; - font-size: 20px; - margin: 10px 0 0 0; +div.toc > dl > dd > dl > dd > dl > dt { + font-weight: bold; + font-size: 20px; + margin: 10px 0 0 0; } tbody.footnotes * { - border: none !important; + border: none !important; } div.footnote p { - margin: 0; - line-height: 1; + margin: 0; + line-height: 1; } div.footnote p sup { - margin-right: 6px; - vertical-align: middle; + margin-right: 6px; + vertical-align: middle; } div.navheader { - border-bottom: 1px solid #CCCCCC; + border-bottom: 1px solid #CCCCCC; } div.navfooter { - border-top: 1px solid #CCCCCC; + border-top: 1px solid #CCCCCC; } .title { - margin-left: -1em; - padding-left: 1em; + margin-left: -1em; + padding-left: 1em; } -.title>a { - position: absolute; - visibility: hidden; - display: block; - font-size: 0.85em; - margin-top: 0.05em; - margin-left: -1em; - vertical-align: text-top; - color: black; +.title > a { + position: absolute; + visibility: hidden; + display: block; + font-size: 0.85em; + margin-top: 0.05em; + margin-left: -1em; + vertical-align: text-top; + color: black; } -.title>a:before { - content: "\00A7"; +.title > a:before { + content: "\00A7"; } -.title:hover>a,.title>a:hover,.title:hover>a:hover { - visibility: visible; +.title:hover > a, .title > a:hover, .title:hover > a:hover { + visibility: visible; } -.title:focus>a,.title>a:focus,.title:focus>a:focus { - outline: 0; +.title:focus > a, .title > a:focus, .title:focus > a:focus { + outline: 0; } diff --git a/2.1.x/index.html b/2.1.x/index.html index 24a3ebe3..bb54b532 100644 --- a/2.1.x/index.html +++ b/2.1.x/index.html @@ -90,7 +90,7 @@ $(addBlockSwitches);
-

2.1.2.BUILD-SNAPSHOT

+

2.1.3.BUILD-SNAPSHOT

diff --git a/2.1.x/multi/css/highlight.css b/2.1.x/multi/css/highlight.css index ffefef72..3850f8b9 100644 --- a/2.1.x/multi/css/highlight.css +++ b/2.1.x/multi/css/highlight.css @@ -4,32 +4,32 @@ */ .hl-keyword { - color: #7F0055; - font-weight: bold; + color: #7F0055; + font-weight: bold; } .hl-comment { - color: #3F5F5F; - font-style: italic; + color: #3F5F5F; + font-style: italic; } .hl-multiline-comment { - color: #3F5FBF; - font-style: italic; + color: #3F5FBF; + font-style: italic; } .hl-tag { - color: #3F7F7F; + color: #3F7F7F; } .hl-attribute { - color: #7F007F; + color: #7F007F; } .hl-value { - color: #2A00FF; + color: #2A00FF; } .hl-string { - color: #2A00FF; + color: #2A00FF; } \ No newline at end of file diff --git a/2.1.x/multi/css/manual-multipage.css b/2.1.x/multi/css/manual-multipage.css index 0c484531..b790654b 100644 --- a/2.1.x/multi/css/manual-multipage.css +++ b/2.1.x/multi/css/manual-multipage.css @@ -1,7 +1,7 @@ @IMPORT url("manual.css"); body.firstpage { - background: url("../images/background.png") no-repeat center top; + background: url("../images/background.png") no-repeat center top; } div.part h1 { diff --git a/2.1.x/multi/css/manual-singlepage.css b/2.1.x/multi/css/manual-singlepage.css index 4a7fd140..303192a8 100644 --- a/2.1.x/multi/css/manual-singlepage.css +++ b/2.1.x/multi/css/manual-singlepage.css @@ -1,6 +1,6 @@ @IMPORT url("manual.css"); body { - background: url("../images/background.png") no-repeat center top; + background: url("../images/background.png") no-repeat center top; } diff --git a/2.1.x/multi/css/manual.css b/2.1.x/multi/css/manual.css index 0ecbe2e8..20cf07da 100644 --- a/2.1.x/multi/css/manual.css +++ b/2.1.x/multi/css/manual.css @@ -1,344 +1,342 @@ @IMPORT url("highlight.css"); html { - padding: 0pt; - margin: 0pt; + padding: 0pt; + margin: 0pt; } body { - color: #333333; - margin: 15px 30px; - font-family: Helvetica, Arial, Freesans, Clean, Sans-serif; - line-height: 1.6; - -webkit-font-smoothing: antialiased; + color: #333333; + margin: 15px 30px; + font-family: Helvetica, Arial, Freesans, Clean, Sans-serif; + line-height: 1.6; + -webkit-font-smoothing: antialiased; } code { - font-size: 16px; - font-family: Consolas, "Liberation Mono", Courier, monospace; + font-size: 16px; + font-family: Consolas, "Liberation Mono", Courier, monospace; } -:not(a)>code { - color: #6D180B; +:not(a) > code { + color: #6D180B; } -:not(pre)>code { - background-color: #F2F2F2; - border: 1px solid #CCCCCC; - border-radius: 4px; - padding: 1px 3px 0; - text-shadow: none; - white-space: nowrap; +:not(pre) > code { + background-color: #F2F2F2; + border: 1px solid #CCCCCC; + border-radius: 4px; + padding: 1px 3px 0; + text-shadow: none; + white-space: nowrap; } -body>*:first-child { - margin-top: 0 !important; +body > *:first-child { + margin-top: 0 !important; } div { - margin: 0pt; + margin: 0pt; } hr { - border: 1px solid #CCCCCC; - background: #CCCCCC; + border: 1px solid #CCCCCC; + background: #CCCCCC; } -h1,h2,h3,h4,h5,h6 { - color: #000000; - cursor: text; - font-weight: bold; - margin: 30px 0 10px; - padding: 0; +h1, h2, h3, h4, h5, h6 { + color: #000000; + cursor: text; + font-weight: bold; + margin: 30px 0 10px; + padding: 0; } -h1,h2,h3 { - margin: 40px 0 10px; +h1, h2, h3 { + margin: 40px 0 10px; } h1 { - margin: 70px 0 30px; - padding-top: 20px; + margin: 70px 0 30px; + padding-top: 20px; } div.part h1 { - border-top: 1px dotted #CCCCCC; + border-top: 1px dotted #CCCCCC; } -h1,h1 code { - font-size: 32px; +h1, h1 code { + font-size: 32px; } -h2,h2 code { - font-size: 24px; +h2, h2 code { + font-size: 24px; } -h3,h3 code { - font-size: 20px; +h3, h3 code { + font-size: 20px; } -h4,h1 code,h5,h5 code,h6,h6 code { - font-size: 18px; +h4, h1 code, h5, h5 code, h6, h6 code { + font-size: 18px; } -div.book,div.chapter,div.appendix,div.part,div.preface { - min-width: 300px; - max-width: 1200px; - margin: 0 auto; +div.book, div.chapter, div.appendix, div.part, div.preface { + min-width: 300px; + max-width: 1200px; + margin: 0 auto; } p.releaseinfo { - font-weight: bold; - margin-bottom: 40px; - margin-top: 40px; + font-weight: bold; + margin-bottom: 40px; + margin-top: 40px; } div.authorgroup { - line-height: 1; + line-height: 1; } p.copyright { - line-height: 1; - margin-bottom: -5px; + line-height: 1; + margin-bottom: -5px; } .legalnotice p { - font-style: italic; - font-size: 14px; - line-height: 1; + font-style: italic; + font-size: 14px; + line-height: 1; } -div.titlepage+p,div.titlepage+p { - margin-top: 0; +div.titlepage + p, div.titlepage + p { + margin-top: 0; } pre { - line-height: 1.0; - color: black; + line-height: 1.0; + color: black; } a { - color: #4183C4; - text-decoration: none; + color: #4183C4; + text-decoration: none; } p { - margin: 15px 0; - text-align: left; + margin: 15px 0; + text-align: left; } -ul,ol { - padding-left: 30px; +ul, ol { + padding-left: 30px; } li p { - margin: 0; + margin: 0; } div.table { - margin: 1em; - padding: 0.5em; - text-align: center; + margin: 1em; + padding: 0.5em; + text-align: center; } -div.table table,div.informaltable table { - display: table; - width: 100%; +div.table table, div.informaltable table { + display: table; + width: 100%; } div.table td { - padding-left: 7px; - padding-right: 7px; + padding-left: 7px; + padding-right: 7px; } .sidebar { - line-height: 1.4; - padding: 0 20px; - background-color: #F8F8F8; - border: 1px solid #CCCCCC; - border-radius: 3px 3px 3px 3px; + line-height: 1.4; + padding: 0 20px; + background-color: #F8F8F8; + border: 1px solid #CCCCCC; + border-radius: 3px 3px 3px 3px; } .sidebar p.title { - color: #6D180B; + color: #6D180B; } -pre.programlisting,pre.screen { - font-size: 15px; - padding: 6px 10px; - background-color: #F8F8F8; - border: 1px solid #CCCCCC; - border-radius: 3px 3px 3px 3px; - clear: both; - overflow: auto; - line-height: 1.4; - font-family: Consolas, "Liberation Mono", Courier, monospace; +pre.programlisting, pre.screen { + font-size: 15px; + padding: 6px 10px; + background-color: #F8F8F8; + border: 1px solid #CCCCCC; + border-radius: 3px 3px 3px 3px; + clear: both; + overflow: auto; + line-height: 1.4; + font-family: Consolas, "Liberation Mono", Courier, monospace; } table { - border-collapse: collapse; - border-spacing: 0; - border: 1px solid #DDDDDD !important; - border-radius: 4px !important; - border-collapse: separate !important; - line-height: 1.6; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid #DDDDDD !important; + border-radius: 4px !important; + border-collapse: separate !important; + line-height: 1.6; } table thead { - background: #F5F5F5; + background: #F5F5F5; } table tr { - border: none; - border-bottom: none; + border: none; + border-bottom: none; } table th { - font-weight: bold; + font-weight: bold; } -table th,table td { - border: none !important; - padding: 6px 13px; +table th, table td { + border: none !important; + padding: 6px 13px; } table tr:nth-child(2n) { - background-color: #F8F8F8; + background-color: #F8F8F8; } td p { - margin: 0 0 15px 0; + margin: 0 0 15px 0; } div.table-contents td p { - margin: 0; + margin: 0; } -div.important *,div.note *,div.tip *,div.warning *,div.navheader *,div.navfooter *,div.calloutlist * - { - border: none !important; - background: none !important; - margin: 0; +div.important *, div.note *, div.tip *, div.warning *, div.navheader *, div.navfooter *, div.calloutlist * { + border: none !important; + background: none !important; + margin: 0; } -div.important p,div.note p,div.tip p,div.warning p { - color: #6F6F6F; - line-height: 1.6; +div.important p, div.note p, div.tip p, div.warning p { + color: #6F6F6F; + line-height: 1.6; } -div.important code,div.note code,div.tip code,div.warning code { - background-color: #F2F2F2 !important; - border: 1px solid #CCCCCC !important; - border-radius: 4px !important; - padding: 1px 3px 0 !important; - text-shadow: none !important; - white-space: nowrap !important; +div.important code, div.note code, div.tip code, div.warning code { + background-color: #F2F2F2 !important; + border: 1px solid #CCCCCC !important; + border-radius: 4px !important; + padding: 1px 3px 0 !important; + text-shadow: none !important; + white-space: nowrap !important; } -.note th,.tip th,.warning th { - display: none; +.note th, .tip th, .warning th { + display: none; } -.note tr:first-child td,.tip tr:first-child td,.warning tr:first-child td - { - border-right: 1px solid #CCCCCC !important; - padding-top: 10px; +.note tr:first-child td, .tip tr:first-child td, .warning tr:first-child td { + border-right: 1px solid #CCCCCC !important; + padding-top: 10px; } -div.calloutlist p,div.calloutlist td { - padding: 0; - margin: 0; +div.calloutlist p, div.calloutlist td { + padding: 0; + margin: 0; } -div.calloutlist>table>tbody>tr>td:first-child { - padding-left: 10px; - width: 30px !important; +div.calloutlist > table > tbody > tr > td:first-child { + padding-left: 10px; + width: 30px !important; } -div.important,div.note,div.tip,div.warning { - margin-left: 0px !important; - margin-right: 20px !important; - margin-top: 20px; - margin-bottom: 20px; - padding-top: 10px; - padding-bottom: 10px; +div.important, div.note, div.tip, div.warning { + margin-left: 0px !important; + margin-right: 20px !important; + margin-top: 20px; + margin-bottom: 20px; + padding-top: 10px; + padding-bottom: 10px; } div.toc { - line-height: 1.2; + line-height: 1.2; } -dl,dt { - margin-top: 1px; - margin-bottom: 0; +dl, dt { + margin-top: 1px; + margin-bottom: 0; } -div.toc>dl>dt { - font-size: 32px; - font-weight: bold; - margin: 30px 0 10px 0; - display: block; +div.toc > dl > dt { + font-size: 32px; + font-weight: bold; + margin: 30px 0 10px 0; + display: block; } -div.toc>dl>dd>dl>dt { - font-size: 24px; - font-weight: bold; - margin: 20px 0 10px 0; - display: block; +div.toc > dl > dd > dl > dt { + font-size: 24px; + font-weight: bold; + margin: 20px 0 10px 0; + display: block; } -div.toc>dl>dd>dl>dd>dl>dt { - font-weight: bold; - font-size: 20px; - margin: 10px 0 0 0; +div.toc > dl > dd > dl > dd > dl > dt { + font-weight: bold; + font-size: 20px; + margin: 10px 0 0 0; } tbody.footnotes * { - border: none !important; + border: none !important; } div.footnote p { - margin: 0; - line-height: 1; + margin: 0; + line-height: 1; } div.footnote p sup { - margin-right: 6px; - vertical-align: middle; + margin-right: 6px; + vertical-align: middle; } div.navheader { - border-bottom: 1px solid #CCCCCC; + border-bottom: 1px solid #CCCCCC; } div.navfooter { - border-top: 1px solid #CCCCCC; + border-top: 1px solid #CCCCCC; } .title { - margin-left: -1em; - padding-left: 1em; + margin-left: -1em; + padding-left: 1em; } -.title>a { - position: absolute; - visibility: hidden; - display: block; - font-size: 0.85em; - margin-top: 0.05em; - margin-left: -1em; - vertical-align: text-top; - color: black; +.title > a { + position: absolute; + visibility: hidden; + display: block; + font-size: 0.85em; + margin-top: 0.05em; + margin-left: -1em; + vertical-align: text-top; + color: black; } -.title>a:before { - content: "\00A7"; +.title > a:before { + content: "\00A7"; } -.title:hover>a,.title>a:hover,.title:hover>a:hover { - visibility: visible; +.title:hover > a, .title > a:hover, .title:hover > a:hover { + visibility: visible; } -.title:focus>a,.title>a:focus,.title:focus>a:focus { - outline: 0; +.title:focus > a, .title > a:focus, .title:focus > a:focus { + outline: 0; } diff --git a/2.1.x/multi/multi__client_side_usage.html b/2.1.x/multi/multi__client_side_usage.html index 5be05077..192bfe69 100644 --- a/2.1.x/multi/multi__client_side_usage.html +++ b/2.1.x/multi/multi__client_side_usage.html @@ -13,7 +13,7 @@ the test cases). Example Maven configuration:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-vault-config</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> @@ -31,11 +31,11 @@ the test cases). Example Maven configuration:


Then you can create a standard Spring Boot application, like this simple HTTP server:

@SpringBootApplication
-@RestController
+<!-- repositories also needed for snapshots and milestones -->

Then you can create a standard Spring Boot application, like this simple HTTP server:

@SpringBootApplication
+@RestController
 public class Application {
 
-    @RequestMapping("/")
+    @RequestMapping("/")
     public String home() {
         return "Hello World!";
     }
@@ -49,13 +49,13 @@ the startup behavior you can change the location of the Vault server
 using bootstrap.properties (like application.properties but for
 the bootstrap phase of an application context), e.g.

Example 2.2. bootstrap.yml

spring.cloud.vault:
     host: localhost
-    port: 8200
+    port: 8200
     scheme: https
-    uri: https://localhost:8200
-    connection-timeout: 5000
-    read-timeout: 15000
+    uri: https://localhost:8200
+    connection-timeout: 5000
+    read-timeout: 15000
     config:
-        order: -10

  • host sets the hostname of the Vault host. The host name will be used + order: -10

Enabling further integrations requires additional dependencies and configuration. Depending on how you have set up Vault you might need @@ -63,4 +63,4 @@ additional configuration like SSL and authentication.

If the application imports the spring-boot-starter-actuator project, the status of the vault server will be available via the /health endpoint.

The vault health indicator can be enabled or disabled through the property management.health.vault.enabled (default to true).

2.1 Authentication

Vault requires an authentication mechanism to authorize client requests.

Spring Cloud Vault supports multiple authentication mechanisms to authenticate applications with Vault.

For a quickstart, use the root token printed by the Vault initialization.

Example 2.3. bootstrap.yml

spring.cloud.vault:
-    token: 19aefa97-cccc-bbbb-aaaa-225940e63d76

[Warning]Warning

Consider carefully your security requirements. Static token authentication is fine if you want quickly get started with Vault, but a static token is not protected any further. Any disclosure to unintended parties allows Vault use with the associated token roles.

\ No newline at end of file + token: 19aefa97-cccc-bbbb-aaaa-225940e63d76
[Warning]Warning

Consider carefully your security requirements. Static token authentication is fine if you want quickly get started with Vault, but a static token is not protected any further. Any disclosure to unintended parties allows Vault use with the associated token roles.

\ No newline at end of file diff --git a/2.1.x/multi/multi__quick_start.html b/2.1.x/multi/multi__quick_start.html index c26bf000..e967cdc6 100644 --- a/2.1.x/multi/multi__quick_start.html +++ b/2.1.x/multi/multi__quick_start.html @@ -6,24 +6,24 @@ Vault is sealed and not initialized when starting up.

[Note]Note

If you want to run tests, leave Vault uninitialized. The tests will initialize Vault and create a root token 00000000-0000-0000-0000-000000000000.

If you want to use Vault for your application or give it a try then you need to initialize it first.

$ export VAULT_ADDR="https://localhost:8200"
 $ export VAULT_SKIP_VERIFY=true # Don't do this for production
-$ vault init

You should see something like:

Key 1: 7149c6a2e16b8833f6eb1e76df03e47f6113a3288b3093faf5033d44f0e70fe701
-Key 2: 901c534c7988c18c20435a85213c683bdcf0efcd82e38e2893779f152978c18c02
-Key 3: 03ff3948575b1165a20c20ee7c3e6edf04f4cdbe0e82dbff5be49c63f98bc03a03
-Key 4: 216ae5cc3ddaf93ceb8e1d15bb9fc3176653f5b738f5f3d1ee00cd7dccbe926e04
-Key 5: b2898fc8130929d569c1677ee69dc5f3be57d7c4b494a6062693ce0b1c4d93d805
-Initial Root Token: 19aefa97-cccc-bbbb-aaaa-225940e63d76
+$ vault init

You should see something like:

Key 1: 7149c6a2e16b8833f6eb1e76df03e47f6113a3288b3093faf5033d44f0e70fe701
+Key 2: 901c534c7988c18c20435a85213c683bdcf0efcd82e38e2893779f152978c18c02
+Key 3: 03ff3948575b1165a20c20ee7c3e6edf04f4cdbe0e82dbff5be49c63f98bc03a03
+Key 4: 216ae5cc3ddaf93ceb8e1d15bb9fc3176653f5b738f5f3d1ee00cd7dccbe926e04
+Key 5: b2898fc8130929d569c1677ee69dc5f3be57d7c4b494a6062693ce0b1c4d93d805
+Initial Root Token: 19aefa97-cccc-bbbb-aaaa-225940e63d76
 
-Vault initialized with 5 keys and a key threshold of 3. Please
+Vault initialized with 5 keys and a key threshold of 3. Please
 securely distribute the above keys. When the Vault is re-sealed,
-restarted, or stopped, you must provide at least 3 of these keys
+restarted, or stopped, you must provide at least 3 of these keys
 to unseal it again.
 
-Vault does not store the master key. Without at least 3 keys,
+Vault does not store the master key. Without at least 3 keys,
 your Vault will remain permanently sealed.

Vault will initialize and return a set of unsealing keys and the root token. Pick 3 keys and unseal Vault. Store the Vault token in the VAULT_TOKEN - environment variable.

$ vault unseal (Key 1)
-$ vault unseal (Key 2)
-$ vault unseal (Key 3)
+ environment variable.

$ vault unseal (Key 1)
+$ vault unseal (Key 2)
+$ vault unseal (Key 3)
 $ export VAULT_TOKEN=(Root token)
 # Required to run Spring Cloud Vault tests after manual initialization
 $ vault token-create -id="00000000-0000-0000-0000-000000000000" -policy="root"

Spring Cloud Vault accesses different resources. By default, the secret diff --git a/2.1.x/multi/multi_vault.config.authentication.html b/2.1.x/multi/multi_vault.config.authentication.html index 1c67b6b0..0161337c 100644 --- a/2.1.x/multi/multi_vault.config.authentication.html +++ b/2.1.x/multi/multi_vault.config.authentication.html @@ -8,7 +8,7 @@ Token authentication requires a static token to be provided using the If a token is disclosed an unintended party gains access to Vault and can access secrets for the intended client.

Example 3.1. bootstrap.yml

spring.cloud.vault:
     authentication: TOKEN
-    token: 00000000-0000-0000-0000-000000000000

  • authentication setting this value to TOKEN selects the Token + token: 00000000-0000-0000-0000-000000000000

See also: Vault Documentation: Tokens

3.2 AppId authentication

Vault supports AppId authentication that consists of two hard to guess tokens. The AppId defaults to spring.application.name that is statically configured. @@ -44,7 +44,7 @@ obtain a token.

app-id: user-id: com.examlple.MyUserIdMechanism


Example 3.5. MyUserIdMechanism.java

public class MyUserIdMechanism implements AppIdUserIdMechanism {
 
-  @Override
+  @Override
   public String createUserId() {
     String userId = ...
     return userId;
@@ -55,11 +55,11 @@ AppRole authentication consists of two hard to guess (secret) tokens: RoleId and
 Spring Vault will not look up these or create a custom SecretId.

Example 3.6. bootstrap.yml with AppRole authentication properties

spring.cloud.vault:
     authentication: APPROLE
     app-role:
-        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52

The following scenarios are supported along the required configuration details:

Table 3.1. Configuration

Method

RoleId

SecretId

RoleName

Token

Provided RoleId/SecretId

Provided

Provided

  

Provided RoleId without SecretId

Provided

   

Provided RoleId, Pull SecretId

Provided

Provided

Provided

Provided

Pull RoleId, provided SecretId

 

Provided

Provided

Provided

Full Pull Mode

  

Provided

Provided

Wrapped

   

Provided

Wrapped RoleId, provided SecretId

Provided

  

Provided

Provided RoleId, wrapped SecretId

 

Provided

 

Provided


Table 3.2. Pull/Push/Wrapped Matrix

RoleId

SecretId

Supported

Provided

Provided

Provided

Pull

Provided

Wrapped

Provided

Absent

Pull

Provided

Pull

Pull

Pull

Wrapped

Pull

Absent

Wrapped

Provided

Wrapped

Pull

Wrapped

Wrapped

Wrapped

Absent


[Note]Note

You can use still all combinations of push/pull/wrapped modes by providing a configured AppRoleAuthentication bean within the bootstrap context. Spring Cloud Vault cannot derive all possible AppRole combinations from the configuration properties.

[Important]Important

AppRole authentication is limited to simple pull mode using reactive infrastructure. Full pull mode is not yet supported. Using Spring Cloud Vault with the Spring WebFlux stack enables Vault’s reactive auto-configuration which can be disabled by setting spring.cloud.vault.reactive.enabled=false.

Example 3.7. bootstrap.yml with all AppRole authentication properties

spring.cloud.vault:
+        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52

The following scenarios are supported along the required configuration details:

Table 3.1. Configuration

Method

RoleId

SecretId

RoleName

Token

Provided RoleId/SecretId

Provided

Provided

  

Provided RoleId without SecretId

Provided

   

Provided RoleId, Pull SecretId

Provided

Provided

Provided

Provided

Pull RoleId, provided SecretId

 

Provided

Provided

Provided

Full Pull Mode

  

Provided

Provided

Wrapped

   

Provided

Wrapped RoleId, provided SecretId

Provided

  

Provided

Provided RoleId, wrapped SecretId

 

Provided

 

Provided


Table 3.2. Pull/Push/Wrapped Matrix

RoleId

SecretId

Supported

Provided

Provided

Provided

Pull

Provided

Wrapped

Provided

Absent

Pull

Provided

Pull

Pull

Pull

Wrapped

Pull

Absent

Wrapped

Provided

Wrapped

Pull

Wrapped

Wrapped

Wrapped

Absent


[Note]Note

You can use still all combinations of push/pull/wrapped modes by providing a configured AppRoleAuthentication bean within the bootstrap context. Spring Cloud Vault cannot derive all possible AppRole combinations from the configuration properties.

[Important]Important

AppRole authentication is limited to simple pull mode using reactive infrastructure. Full pull mode is not yet supported. Using Spring Cloud Vault with the Spring WebFlux stack enables Vault’s reactive auto-configuration which can be disabled by setting spring.cloud.vault.reactive.enabled=false.

Example 3.7. bootstrap.yml with all AppRole authentication properties

spring.cloud.vault:
     authentication: APPROLE
     app-role:
-        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
-        secret-id: 1696536f-1976-73b1-b241-0b4213908d39
+        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
+        secret-id: 1696536f-1976-73b1-b241-0b4213908d39
         role: my-role
         app-role-path: approle

  • role-id sets the RoleId.
  • secret-id sets the SecretId. SecretId can be omitted if AppRole is configured without requiring SecretId (See bind_secret_id).
  • role: sets the AppRole name for pull mode.
  • app-role-path sets the path of the approle authentication mount to use.

See also: Vault Documentation: Using the AppRole auth backend

3.4 AWS-EC2 authentication

The aws-ec2 auth backend provides a secure introduction mechanism @@ -147,7 +147,7 @@ wrapping_token_ttl: 0h10m0s wrapping_token_creation_time: 2016-09-18 20:29:48.652957077 +0200 CEST wrapped_accessor: 46b6aebb-187f-932a-26d7-4f3d86a68319


Example 3.17. bootstrap.yml

spring.cloud.vault:
     authentication: CUBBYHOLE
-    token: 397ccb93-ff6c-b17b-9389-380b01ca2645

See also:

3.9 GCP-GCE authentication

The gcp + token: 397ccb93-ff6c-b17b-9389-380b01ca2645


See also:

3.9 GCP-GCE authentication

The gcp auth backend allows Vault login by using existing GCP (Google Cloud Platform) IAM and GCE credentials.

GCP GCE (Google Compute Engine) authentication creates a signature in the form of a JSON Web Token (JWT) for a service account. A JWT for a Compute Engine instance is obtained from the GCE metadata service using Instance identification. @@ -183,7 +183,7 @@ service account identifier required for calling projects.s location: classpath:credentials.json encoded-key: e+KApn0= gcp-path: gcp - jwt-validity: 15m + jwt-validity: 15m project-id: my-project-id role: my-dev-role service-account: my-service@projectid.iam.gserviceaccount.com


  • role sets the name of the role against which the login is being attempted.
  • credentials.location path to the credentials resource that contains Google credentials in JSON format.
  • credentials.encoded-key the base64 encoded contents of an OAuth2 account private key in the JSON format.
  • gcp-path sets the path of the GCP mount to use
  • jwt-validity configures the JWT token validity. Defaults to 15 minutes.
  • project-id allows overriding the project Id to a specific value. Defaults to the project Id from the obtained credential.
  • service-account allows overriding the service account Id to a specific value. Defaults to the service account from the obtained credential.

GCP IAM authentication requires the Google Cloud Java SDK dependency diff --git a/2.1.x/multi/multi_vault.config.backends.configurer.html b/2.1.x/multi/multi_vault.config.backends.configurer.html index 996aa2c4..0ef48ed2 100644 --- a/2.1.x/multi/multi_vault.config.backends.configurer.html +++ b/2.1.x/multi/multi_vault.config.backends.configurer.html @@ -9,7 +9,7 @@ Default generic and discovered backend registration is disabled if Spring Cloud at least one VaultConfigurer bean. You can however enable default registration with SecretBackendConfigurer.registerDefaultGenericSecretBackends() and SecretBackendConfigurer.registerDefaultDiscoveredSecretBackends().

public class CustomizationBean implements VaultConfigurer {
 
-    @Override
+    @Override
     public void addSecretBackends(SecretBackendConfigurer configurer) {
 
         configurer.add("secret/my-application");
diff --git a/2.1.x/multi/multi_vault.config.backends.database-backends.html b/2.1.x/multi/multi_vault.config.backends.database-backends.html
index f588bf21..7d04e610 100644
--- a/2.1.x/multi/multi_vault.config.backends.database-backends.html
+++ b/2.1.x/multi/multi_vault.config.backends.database-backends.html
@@ -13,7 +13,7 @@ backend path, e.g. spring.cloud.vault.mysql.role.backend=d
     <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-vault-config-databases</artifactId>
-        <version>2.1.2.BUILD-SNAPSHOT</version>
+        <version>2.1.3.BUILD-SNAPSHOT</version>
     </dependency>
 </dependencies>

[Note]Note

Enabling multiple JDBC-compliant databases will generate credentials and store them by default in the same property keys hence property names for diff --git a/2.1.x/multi/multi_vault.config.backends.html b/2.1.x/multi/multi_vault.config.backends.html index 450b6a6a..02a36839 100644 --- a/2.1.x/multi/multi_vault.config.backends.html +++ b/2.1.x/multi/multi_vault.config.backends.html @@ -46,7 +46,7 @@ dependency.

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-vault-config-consul</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> </dependencies>


The integration can be enabled by setting spring.cloud.vault.consul.enabled=true (default false) and @@ -63,7 +63,7 @@ dependency.

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-vault-config-rabbitmq</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> </dependencies>


The integration can be enabled by setting spring.cloud.vault.rabbitmq.enabled=true (default false) @@ -82,7 +82,7 @@ dependency.

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-vault-config-aws</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> </dependencies>


The integration can be enabled by setting spring.cloud.vault.aws=true (default false) diff --git a/2.1.x/single/css/highlight.css b/2.1.x/single/css/highlight.css index ffefef72..3850f8b9 100644 --- a/2.1.x/single/css/highlight.css +++ b/2.1.x/single/css/highlight.css @@ -4,32 +4,32 @@ */ .hl-keyword { - color: #7F0055; - font-weight: bold; + color: #7F0055; + font-weight: bold; } .hl-comment { - color: #3F5F5F; - font-style: italic; + color: #3F5F5F; + font-style: italic; } .hl-multiline-comment { - color: #3F5FBF; - font-style: italic; + color: #3F5FBF; + font-style: italic; } .hl-tag { - color: #3F7F7F; + color: #3F7F7F; } .hl-attribute { - color: #7F007F; + color: #7F007F; } .hl-value { - color: #2A00FF; + color: #2A00FF; } .hl-string { - color: #2A00FF; + color: #2A00FF; } \ No newline at end of file diff --git a/2.1.x/single/css/manual-multipage.css b/2.1.x/single/css/manual-multipage.css index 0c484531..b790654b 100644 --- a/2.1.x/single/css/manual-multipage.css +++ b/2.1.x/single/css/manual-multipage.css @@ -1,7 +1,7 @@ @IMPORT url("manual.css"); body.firstpage { - background: url("../images/background.png") no-repeat center top; + background: url("../images/background.png") no-repeat center top; } div.part h1 { diff --git a/2.1.x/single/css/manual-singlepage.css b/2.1.x/single/css/manual-singlepage.css index 4a7fd140..303192a8 100644 --- a/2.1.x/single/css/manual-singlepage.css +++ b/2.1.x/single/css/manual-singlepage.css @@ -1,6 +1,6 @@ @IMPORT url("manual.css"); body { - background: url("../images/background.png") no-repeat center top; + background: url("../images/background.png") no-repeat center top; } diff --git a/2.1.x/single/css/manual.css b/2.1.x/single/css/manual.css index 0ecbe2e8..20cf07da 100644 --- a/2.1.x/single/css/manual.css +++ b/2.1.x/single/css/manual.css @@ -1,344 +1,342 @@ @IMPORT url("highlight.css"); html { - padding: 0pt; - margin: 0pt; + padding: 0pt; + margin: 0pt; } body { - color: #333333; - margin: 15px 30px; - font-family: Helvetica, Arial, Freesans, Clean, Sans-serif; - line-height: 1.6; - -webkit-font-smoothing: antialiased; + color: #333333; + margin: 15px 30px; + font-family: Helvetica, Arial, Freesans, Clean, Sans-serif; + line-height: 1.6; + -webkit-font-smoothing: antialiased; } code { - font-size: 16px; - font-family: Consolas, "Liberation Mono", Courier, monospace; + font-size: 16px; + font-family: Consolas, "Liberation Mono", Courier, monospace; } -:not(a)>code { - color: #6D180B; +:not(a) > code { + color: #6D180B; } -:not(pre)>code { - background-color: #F2F2F2; - border: 1px solid #CCCCCC; - border-radius: 4px; - padding: 1px 3px 0; - text-shadow: none; - white-space: nowrap; +:not(pre) > code { + background-color: #F2F2F2; + border: 1px solid #CCCCCC; + border-radius: 4px; + padding: 1px 3px 0; + text-shadow: none; + white-space: nowrap; } -body>*:first-child { - margin-top: 0 !important; +body > *:first-child { + margin-top: 0 !important; } div { - margin: 0pt; + margin: 0pt; } hr { - border: 1px solid #CCCCCC; - background: #CCCCCC; + border: 1px solid #CCCCCC; + background: #CCCCCC; } -h1,h2,h3,h4,h5,h6 { - color: #000000; - cursor: text; - font-weight: bold; - margin: 30px 0 10px; - padding: 0; +h1, h2, h3, h4, h5, h6 { + color: #000000; + cursor: text; + font-weight: bold; + margin: 30px 0 10px; + padding: 0; } -h1,h2,h3 { - margin: 40px 0 10px; +h1, h2, h3 { + margin: 40px 0 10px; } h1 { - margin: 70px 0 30px; - padding-top: 20px; + margin: 70px 0 30px; + padding-top: 20px; } div.part h1 { - border-top: 1px dotted #CCCCCC; + border-top: 1px dotted #CCCCCC; } -h1,h1 code { - font-size: 32px; +h1, h1 code { + font-size: 32px; } -h2,h2 code { - font-size: 24px; +h2, h2 code { + font-size: 24px; } -h3,h3 code { - font-size: 20px; +h3, h3 code { + font-size: 20px; } -h4,h1 code,h5,h5 code,h6,h6 code { - font-size: 18px; +h4, h1 code, h5, h5 code, h6, h6 code { + font-size: 18px; } -div.book,div.chapter,div.appendix,div.part,div.preface { - min-width: 300px; - max-width: 1200px; - margin: 0 auto; +div.book, div.chapter, div.appendix, div.part, div.preface { + min-width: 300px; + max-width: 1200px; + margin: 0 auto; } p.releaseinfo { - font-weight: bold; - margin-bottom: 40px; - margin-top: 40px; + font-weight: bold; + margin-bottom: 40px; + margin-top: 40px; } div.authorgroup { - line-height: 1; + line-height: 1; } p.copyright { - line-height: 1; - margin-bottom: -5px; + line-height: 1; + margin-bottom: -5px; } .legalnotice p { - font-style: italic; - font-size: 14px; - line-height: 1; + font-style: italic; + font-size: 14px; + line-height: 1; } -div.titlepage+p,div.titlepage+p { - margin-top: 0; +div.titlepage + p, div.titlepage + p { + margin-top: 0; } pre { - line-height: 1.0; - color: black; + line-height: 1.0; + color: black; } a { - color: #4183C4; - text-decoration: none; + color: #4183C4; + text-decoration: none; } p { - margin: 15px 0; - text-align: left; + margin: 15px 0; + text-align: left; } -ul,ol { - padding-left: 30px; +ul, ol { + padding-left: 30px; } li p { - margin: 0; + margin: 0; } div.table { - margin: 1em; - padding: 0.5em; - text-align: center; + margin: 1em; + padding: 0.5em; + text-align: center; } -div.table table,div.informaltable table { - display: table; - width: 100%; +div.table table, div.informaltable table { + display: table; + width: 100%; } div.table td { - padding-left: 7px; - padding-right: 7px; + padding-left: 7px; + padding-right: 7px; } .sidebar { - line-height: 1.4; - padding: 0 20px; - background-color: #F8F8F8; - border: 1px solid #CCCCCC; - border-radius: 3px 3px 3px 3px; + line-height: 1.4; + padding: 0 20px; + background-color: #F8F8F8; + border: 1px solid #CCCCCC; + border-radius: 3px 3px 3px 3px; } .sidebar p.title { - color: #6D180B; + color: #6D180B; } -pre.programlisting,pre.screen { - font-size: 15px; - padding: 6px 10px; - background-color: #F8F8F8; - border: 1px solid #CCCCCC; - border-radius: 3px 3px 3px 3px; - clear: both; - overflow: auto; - line-height: 1.4; - font-family: Consolas, "Liberation Mono", Courier, monospace; +pre.programlisting, pre.screen { + font-size: 15px; + padding: 6px 10px; + background-color: #F8F8F8; + border: 1px solid #CCCCCC; + border-radius: 3px 3px 3px 3px; + clear: both; + overflow: auto; + line-height: 1.4; + font-family: Consolas, "Liberation Mono", Courier, monospace; } table { - border-collapse: collapse; - border-spacing: 0; - border: 1px solid #DDDDDD !important; - border-radius: 4px !important; - border-collapse: separate !important; - line-height: 1.6; + border-collapse: collapse; + border-spacing: 0; + border: 1px solid #DDDDDD !important; + border-radius: 4px !important; + border-collapse: separate !important; + line-height: 1.6; } table thead { - background: #F5F5F5; + background: #F5F5F5; } table tr { - border: none; - border-bottom: none; + border: none; + border-bottom: none; } table th { - font-weight: bold; + font-weight: bold; } -table th,table td { - border: none !important; - padding: 6px 13px; +table th, table td { + border: none !important; + padding: 6px 13px; } table tr:nth-child(2n) { - background-color: #F8F8F8; + background-color: #F8F8F8; } td p { - margin: 0 0 15px 0; + margin: 0 0 15px 0; } div.table-contents td p { - margin: 0; + margin: 0; } -div.important *,div.note *,div.tip *,div.warning *,div.navheader *,div.navfooter *,div.calloutlist * - { - border: none !important; - background: none !important; - margin: 0; +div.important *, div.note *, div.tip *, div.warning *, div.navheader *, div.navfooter *, div.calloutlist * { + border: none !important; + background: none !important; + margin: 0; } -div.important p,div.note p,div.tip p,div.warning p { - color: #6F6F6F; - line-height: 1.6; +div.important p, div.note p, div.tip p, div.warning p { + color: #6F6F6F; + line-height: 1.6; } -div.important code,div.note code,div.tip code,div.warning code { - background-color: #F2F2F2 !important; - border: 1px solid #CCCCCC !important; - border-radius: 4px !important; - padding: 1px 3px 0 !important; - text-shadow: none !important; - white-space: nowrap !important; +div.important code, div.note code, div.tip code, div.warning code { + background-color: #F2F2F2 !important; + border: 1px solid #CCCCCC !important; + border-radius: 4px !important; + padding: 1px 3px 0 !important; + text-shadow: none !important; + white-space: nowrap !important; } -.note th,.tip th,.warning th { - display: none; +.note th, .tip th, .warning th { + display: none; } -.note tr:first-child td,.tip tr:first-child td,.warning tr:first-child td - { - border-right: 1px solid #CCCCCC !important; - padding-top: 10px; +.note tr:first-child td, .tip tr:first-child td, .warning tr:first-child td { + border-right: 1px solid #CCCCCC !important; + padding-top: 10px; } -div.calloutlist p,div.calloutlist td { - padding: 0; - margin: 0; +div.calloutlist p, div.calloutlist td { + padding: 0; + margin: 0; } -div.calloutlist>table>tbody>tr>td:first-child { - padding-left: 10px; - width: 30px !important; +div.calloutlist > table > tbody > tr > td:first-child { + padding-left: 10px; + width: 30px !important; } -div.important,div.note,div.tip,div.warning { - margin-left: 0px !important; - margin-right: 20px !important; - margin-top: 20px; - margin-bottom: 20px; - padding-top: 10px; - padding-bottom: 10px; +div.important, div.note, div.tip, div.warning { + margin-left: 0px !important; + margin-right: 20px !important; + margin-top: 20px; + margin-bottom: 20px; + padding-top: 10px; + padding-bottom: 10px; } div.toc { - line-height: 1.2; + line-height: 1.2; } -dl,dt { - margin-top: 1px; - margin-bottom: 0; +dl, dt { + margin-top: 1px; + margin-bottom: 0; } -div.toc>dl>dt { - font-size: 32px; - font-weight: bold; - margin: 30px 0 10px 0; - display: block; +div.toc > dl > dt { + font-size: 32px; + font-weight: bold; + margin: 30px 0 10px 0; + display: block; } -div.toc>dl>dd>dl>dt { - font-size: 24px; - font-weight: bold; - margin: 20px 0 10px 0; - display: block; +div.toc > dl > dd > dl > dt { + font-size: 24px; + font-weight: bold; + margin: 20px 0 10px 0; + display: block; } -div.toc>dl>dd>dl>dd>dl>dt { - font-weight: bold; - font-size: 20px; - margin: 10px 0 0 0; +div.toc > dl > dd > dl > dd > dl > dt { + font-weight: bold; + font-size: 20px; + margin: 10px 0 0 0; } tbody.footnotes * { - border: none !important; + border: none !important; } div.footnote p { - margin: 0; - line-height: 1; + margin: 0; + line-height: 1; } div.footnote p sup { - margin-right: 6px; - vertical-align: middle; + margin-right: 6px; + vertical-align: middle; } div.navheader { - border-bottom: 1px solid #CCCCCC; + border-bottom: 1px solid #CCCCCC; } div.navfooter { - border-top: 1px solid #CCCCCC; + border-top: 1px solid #CCCCCC; } .title { - margin-left: -1em; - padding-left: 1em; + margin-left: -1em; + padding-left: 1em; } -.title>a { - position: absolute; - visibility: hidden; - display: block; - font-size: 0.85em; - margin-top: 0.05em; - margin-left: -1em; - vertical-align: text-top; - color: black; +.title > a { + position: absolute; + visibility: hidden; + display: block; + font-size: 0.85em; + margin-top: 0.05em; + margin-left: -1em; + vertical-align: text-top; + color: black; } -.title>a:before { - content: "\00A7"; +.title > a:before { + content: "\00A7"; } -.title:hover>a,.title>a:hover,.title:hover>a:hover { - visibility: visible; +.title:hover > a, .title > a:hover, .title:hover > a:hover { + visibility: visible; } -.title:focus>a,.title>a:focus,.title:focus>a:focus { - outline: 0; +.title:focus > a, .title > a:focus, .title:focus > a:focus { + outline: 0; } diff --git a/2.1.x/single/spring-cloud-vault.html b/2.1.x/single/spring-cloud-vault.html index 25e8be50..165d35da 100644 --- a/2.1.x/single/spring-cloud-vault.html +++ b/2.1.x/single/spring-cloud-vault.html @@ -6,24 +6,24 @@ Vault is sealed and not initialized when starting up.

[Note]Note

If you want to run tests, leave Vault uninitialized. The tests will initialize Vault and create a root token 00000000-0000-0000-0000-000000000000.

If you want to use Vault for your application or give it a try then you need to initialize it first.

$ export VAULT_ADDR="https://localhost:8200"
 $ export VAULT_SKIP_VERIFY=true # Don't do this for production
-$ vault init

You should see something like:

Key 1: 7149c6a2e16b8833f6eb1e76df03e47f6113a3288b3093faf5033d44f0e70fe701
-Key 2: 901c534c7988c18c20435a85213c683bdcf0efcd82e38e2893779f152978c18c02
-Key 3: 03ff3948575b1165a20c20ee7c3e6edf04f4cdbe0e82dbff5be49c63f98bc03a03
-Key 4: 216ae5cc3ddaf93ceb8e1d15bb9fc3176653f5b738f5f3d1ee00cd7dccbe926e04
-Key 5: b2898fc8130929d569c1677ee69dc5f3be57d7c4b494a6062693ce0b1c4d93d805
-Initial Root Token: 19aefa97-cccc-bbbb-aaaa-225940e63d76
+$ vault init

You should see something like:

Key 1: 7149c6a2e16b8833f6eb1e76df03e47f6113a3288b3093faf5033d44f0e70fe701
+Key 2: 901c534c7988c18c20435a85213c683bdcf0efcd82e38e2893779f152978c18c02
+Key 3: 03ff3948575b1165a20c20ee7c3e6edf04f4cdbe0e82dbff5be49c63f98bc03a03
+Key 4: 216ae5cc3ddaf93ceb8e1d15bb9fc3176653f5b738f5f3d1ee00cd7dccbe926e04
+Key 5: b2898fc8130929d569c1677ee69dc5f3be57d7c4b494a6062693ce0b1c4d93d805
+Initial Root Token: 19aefa97-cccc-bbbb-aaaa-225940e63d76
 
-Vault initialized with 5 keys and a key threshold of 3. Please
+Vault initialized with 5 keys and a key threshold of 3. Please
 securely distribute the above keys. When the Vault is re-sealed,
-restarted, or stopped, you must provide at least 3 of these keys
+restarted, or stopped, you must provide at least 3 of these keys
 to unseal it again.
 
-Vault does not store the master key. Without at least 3 keys,
+Vault does not store the master key. Without at least 3 keys,
 your Vault will remain permanently sealed.

Vault will initialize and return a set of unsealing keys and the root token. Pick 3 keys and unseal Vault. Store the Vault token in the VAULT_TOKEN - environment variable.

$ vault unseal (Key 1)
-$ vault unseal (Key 2)
-$ vault unseal (Key 3)
+ environment variable.

$ vault unseal (Key 1)
+$ vault unseal (Key 2)
+$ vault unseal (Key 3)
 $ export VAULT_TOKEN=(Root token)
 # Required to run Spring Cloud Vault tests after manual initialization
 $ vault token-create -id="00000000-0000-0000-0000-000000000000" -policy="root"

Spring Cloud Vault accesses different resources. By default, the secret @@ -47,7 +47,7 @@ the test cases). Example Maven configuration:


Then you can create a standard Spring Boot application, like this simple HTTP server:

@SpringBootApplication
-@RestController
+<!-- repositories also needed for snapshots and milestones -->

Then you can create a standard Spring Boot application, like this simple HTTP server:

@SpringBootApplication
+@RestController
 public class Application {
 
-    @RequestMapping("/")
+    @RequestMapping("/")
     public String home() {
         return "Hello World!";
     }
@@ -83,13 +83,13 @@ the startup behavior you can change the location of the Vault server
 using bootstrap.properties (like application.properties but for
 the bootstrap phase of an application context), e.g.

Example 2.2. bootstrap.yml

spring.cloud.vault:
     host: localhost
-    port: 8200
+    port: 8200
     scheme: https
-    uri: https://localhost:8200
-    connection-timeout: 5000
-    read-timeout: 15000
+    uri: https://localhost:8200
+    connection-timeout: 5000
+    read-timeout: 15000
     config:
-        order: -10

  • host sets the hostname of the Vault host. The host name will be used + order: -10

  • host sets the hostname of the Vault host. The host name will be used for SSL certificate validation
  • port sets the Vault port
  • scheme setting the scheme to http will use plain HTTP. Supported schemes are http and https.
  • uri configure the Vault endpoint with an URI. Takes precedence over host/port/scheme configuration
  • connection-timeout sets the connection timeout in milliseconds
  • read-timeout sets the read timeout in milliseconds
  • config.order sets the order for the property source

Enabling further integrations requires additional dependencies and configuration. Depending on how you have set up Vault you might need @@ -97,7 +97,7 @@ additional configuration like SSL and authentication.

If the application imports the spring-boot-starter-actuator project, the status of the vault server will be available via the /health endpoint.

The vault health indicator can be enabled or disabled through the property management.health.vault.enabled (default to true).

2.1 Authentication

Vault requires an authentication mechanism to authorize client requests.

Spring Cloud Vault supports multiple authentication mechanisms to authenticate applications with Vault.

For a quickstart, use the root token printed by the Vault initialization.

Example 2.3. bootstrap.yml

spring.cloud.vault:
-    token: 19aefa97-cccc-bbbb-aaaa-225940e63d76

[Warning]Warning

Consider carefully your security requirements. Static token authentication is fine if you want quickly get started with Vault, but a static token is not protected any further. Any disclosure to unintended parties allows Vault use with the associated token roles.

3. Authentication methods

Different organizations have different requirements for security + token: 19aefa97-cccc-bbbb-aaaa-225940e63d76


[Warning]Warning

Consider carefully your security requirements. Static token authentication is fine if you want quickly get started with Vault, but a static token is not protected any further. Any disclosure to unintended parties allows Vault use with the associated token roles.

3. Authentication methods

Different organizations have different requirements for security and authentication. Vault reflects that need by shipping multiple authentication methods. Spring Cloud Vault supports token and AppId authentication.

3.1 Token authentication

Tokens are the core method for authentication within Vault. Token authentication requires a static token to be provided using the @@ -105,7 +105,7 @@ Token authentication requires a static token to be provided using the If a token is disclosed an unintended party gains access to Vault and can access secrets for the intended client.

Example 3.1. bootstrap.yml

spring.cloud.vault:
     authentication: TOKEN
-    token: 00000000-0000-0000-0000-000000000000

  • authentication setting this value to TOKEN selects the Token + token: 00000000-0000-0000-0000-000000000000

  • authentication setting this value to TOKEN selects the Token authentication method
  • token sets the static token to use

See also: Vault Documentation: Tokens

3.2 AppId authentication

Vault supports AppId authentication that consists of two hard to guess tokens. The AppId defaults to spring.application.name that is statically configured. @@ -141,7 +141,7 @@ obtain a token.

app-id: user-id: com.examlple.MyUserIdMechanism


Example 3.5. MyUserIdMechanism.java

public class MyUserIdMechanism implements AppIdUserIdMechanism {
 
-  @Override
+  @Override
   public String createUserId() {
     String userId = ...
     return userId;
@@ -152,11 +152,11 @@ AppRole authentication consists of two hard to guess (secret) tokens: RoleId and
 Spring Vault will not look up these or create a custom SecretId.

Example 3.6. bootstrap.yml with AppRole authentication properties

spring.cloud.vault:
     authentication: APPROLE
     app-role:
-        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52

The following scenarios are supported along the required configuration details:

Table 3.1. Configuration

Method

RoleId

SecretId

RoleName

Token

Provided RoleId/SecretId

Provided

Provided

  

Provided RoleId without SecretId

Provided

   

Provided RoleId, Pull SecretId

Provided

Provided

Provided

Provided

Pull RoleId, provided SecretId

 

Provided

Provided

Provided

Full Pull Mode

  

Provided

Provided

Wrapped

   

Provided

Wrapped RoleId, provided SecretId

Provided

  

Provided

Provided RoleId, wrapped SecretId

 

Provided

 

Provided


Table 3.2. Pull/Push/Wrapped Matrix

RoleId

SecretId

Supported

Provided

Provided

Provided

Pull

Provided

Wrapped

Provided

Absent

Pull

Provided

Pull

Pull

Pull

Wrapped

Pull

Absent

Wrapped

Provided

Wrapped

Pull

Wrapped

Wrapped

Wrapped

Absent


[Note]Note

You can use still all combinations of push/pull/wrapped modes by providing a configured AppRoleAuthentication bean within the bootstrap context. Spring Cloud Vault cannot derive all possible AppRole combinations from the configuration properties.

[Important]Important

AppRole authentication is limited to simple pull mode using reactive infrastructure. Full pull mode is not yet supported. Using Spring Cloud Vault with the Spring WebFlux stack enables Vault’s reactive auto-configuration which can be disabled by setting spring.cloud.vault.reactive.enabled=false.

Example 3.7. bootstrap.yml with all AppRole authentication properties

spring.cloud.vault:
+        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52

The following scenarios are supported along the required configuration details:

Table 3.1. Configuration

Method

RoleId

SecretId

RoleName

Token

Provided RoleId/SecretId

Provided

Provided

  

Provided RoleId without SecretId

Provided

   

Provided RoleId, Pull SecretId

Provided

Provided

Provided

Provided

Pull RoleId, provided SecretId

 

Provided

Provided

Provided

Full Pull Mode

  

Provided

Provided

Wrapped

   

Provided

Wrapped RoleId, provided SecretId

Provided

  

Provided

Provided RoleId, wrapped SecretId

 

Provided

 

Provided


Table 3.2. Pull/Push/Wrapped Matrix

RoleId

SecretId

Supported

Provided

Provided

Provided

Pull

Provided

Wrapped

Provided

Absent

Pull

Provided

Pull

Pull

Pull

Wrapped

Pull

Absent

Wrapped

Provided

Wrapped

Pull

Wrapped

Wrapped

Wrapped

Absent


[Note]Note

You can use still all combinations of push/pull/wrapped modes by providing a configured AppRoleAuthentication bean within the bootstrap context. Spring Cloud Vault cannot derive all possible AppRole combinations from the configuration properties.

[Important]Important

AppRole authentication is limited to simple pull mode using reactive infrastructure. Full pull mode is not yet supported. Using Spring Cloud Vault with the Spring WebFlux stack enables Vault’s reactive auto-configuration which can be disabled by setting spring.cloud.vault.reactive.enabled=false.

Example 3.7. bootstrap.yml with all AppRole authentication properties

spring.cloud.vault:
     authentication: APPROLE
     app-role:
-        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
-        secret-id: 1696536f-1976-73b1-b241-0b4213908d39
+        role-id: bde2076b-cccb-3cf0-d57e-bca7b1e83a52
+        secret-id: 1696536f-1976-73b1-b241-0b4213908d39
         role: my-role
         app-role-path: approle

  • role-id sets the RoleId.
  • secret-id sets the SecretId. SecretId can be omitted if AppRole is configured without requiring SecretId (See bind_secret_id).
  • role: sets the AppRole name for pull mode.
  • app-role-path sets the path of the approle authentication mount to use.

See also: Vault Documentation: Using the AppRole auth backend

3.4 AWS-EC2 authentication

The aws-ec2 auth backend provides a secure introduction mechanism @@ -244,7 +244,7 @@ wrapping_token_ttl: 0h10m0s wrapping_token_creation_time: 2016-09-18 20:29:48.652957077 +0200 CEST wrapped_accessor: 46b6aebb-187f-932a-26d7-4f3d86a68319


Example 3.17. bootstrap.yml

spring.cloud.vault:
     authentication: CUBBYHOLE
-    token: 397ccb93-ff6c-b17b-9389-380b01ca2645

See also:

3.9 GCP-GCE authentication

The gcp + token: 397ccb93-ff6c-b17b-9389-380b01ca2645


See also:

3.9 GCP-GCE authentication

The gcp auth backend allows Vault login by using existing GCP (Google Cloud Platform) IAM and GCE credentials.

GCP GCE (Google Compute Engine) authentication creates a signature in the form of a JSON Web Token (JWT) for a service account. A JWT for a Compute Engine instance is obtained from the GCE metadata service using Instance identification. @@ -280,7 +280,7 @@ service account identifier required for calling projects.s location: classpath:credentials.json encoded-key: e+KApn0= gcp-path: gcp - jwt-validity: 15m + jwt-validity: 15m project-id: my-project-id role: my-dev-role service-account: my-service@projectid.iam.gserviceaccount.com


  • role sets the name of the role against which the login is being attempted.
  • credentials.location path to the credentials resource that contains Google credentials in JSON format.
  • credentials.encoded-key the base64 encoded contents of an OAuth2 account private key in the JSON format.
  • gcp-path sets the path of the GCP mount to use
  • jwt-validity configures the JWT token validity. Defaults to 15 minutes.
  • project-id allows overriding the project Id to a specific value. Defaults to the project Id from the obtained credential.
  • service-account allows overriding the service account Id to a specific value. Defaults to the service account from the obtained credential.

GCP IAM authentication requires the Google Cloud Java SDK dependency @@ -339,7 +339,7 @@ dependency.

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-vault-config-consul</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> </dependencies>


The integration can be enabled by setting spring.cloud.vault.consul.enabled=true (default false) and @@ -356,7 +356,7 @@ dependency.

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-vault-config-rabbitmq</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> </dependencies>


The integration can be enabled by setting spring.cloud.vault.rabbitmq.enabled=true (default false) @@ -375,7 +375,7 @@ dependency.

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-vault-config-aws</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> </dependencies>


The integration can be enabled by setting spring.cloud.vault.aws=true (default false) @@ -402,7 +402,7 @@ backend path, e.g. spring.cloud.vault.mysql.role.backend=d <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-vault-config-databases</artifactId> - <version>2.1.2.BUILD-SNAPSHOT</version> + <version>2.1.3.BUILD-SNAPSHOT</version> </dependency> </dependencies>

[Note]Note

Enabling multiple JDBC-compliant databases will generate credentials and store them by default in the same property keys hence property names for @@ -498,7 +498,7 @@ Default generic and discovered backend registration is disabled if Spring Cloud at least one VaultConfigurer bean. You can however enable default registration with SecretBackendConfigurer.registerDefaultGenericSecretBackends() and SecretBackendConfigurer.registerDefaultDiscoveredSecretBackends().

public class CustomizationBean implements VaultConfigurer {
 
-    @Override
+    @Override
     public void addSecretBackends(SecretBackendConfigurer configurer) {
 
         configurer.add("secret/my-application");